2013-03-18 49 views
0

我有一个名为FrameList的自定义对象(PO​​NO)的数组,我可以orderBy和GroupBy进行排序和分组。但现在我想回到一个字典,而我得到的错误:(顺便说一句,有没有错误是我删除了.ToDictionary()方法)Linq排序,分组和返回字典

Error 1 'System.Linq.IGrouping' does not contain a definition for 'type' and no extension method 'type' accepting a first argument of type 'System.Linq.IGrouping' could be found (are you missing a using directive or an assembly reference?) C:\Users\ysg4206\Documents\Visual Studio 2010\Projects\Watson\CatalogServiceClasses\BuildToby.cs 21 38 Watson

这里是代码段中排序和组:

var dict = request.FrameList.OrderBy(f => f.trueDate) 
     .GroupBy(f => f.type) 
     .ToDictionary(f => f.type, f => f); 

和这里是页框的定义(这是FrameData的一个简单的数组)

[DataContract] 
public class FrameData 
{ 
    [DataMember] 
    public String idx { get; set; } 
    [DataMember] 
    public String type { get; set; } 
    [DataMember] 
    public String path { get; set; } 
    [DataMember] 
    public String date { get; set; } 
    [DataMember] 
    public DateTime trueDate { get; set; } 
} 
+0

'.ToDictionary(F => f.Key,F => F)'的IGrouping将组中的元素按类型分为关键。 – Romoku 2013-03-18 16:35:31

回答

3

目前尚不清楚你在做什么试图去做。

如果你只是希望建立一个地道的多图,尝试:

var lookup = request.FrameList.ToLookup(f => f.type); 

如果你正在寻找创建多图与Dictionary类,尝试:

var dict = request.FrameList 
        .GroupBy(f => f.type) 
        .ToDictionary(g => g.Key, g => g.ToList()); 

请注意,在这两种情况下,分组之前的OrderBy是无用的,因为查找和字典本身是无序集合。如果您正在尝试通过订购来完成某项任务(也许您希望某个组中的项目按日期排序?),请澄清一下,并且我们可能会提供更适合的项目。

编辑:基于您的评论,看起来像你需要:

var dict = request.FrameList 
        .GroupBy(f => f.type) 
        .ToDictionary(g => g.Key, 
           g => g.OrderBy(f => f.trueDate) 
             .ToList()); 
+0

+1使用'ToLookup'。达姆,我忘了它... – 2013-03-18 16:44:27

+0

是的,这是我一直在寻找。谢谢。 OrderBy不需要对组(或dictonary元素)进行排序,而是需要将每个键上的List作为排序列表(按日期)。这就是诀窍。 – 2013-03-18 16:44:47

1

假设你的方法签名是IDictionary<string,IList<FrameData>>

尝试使用下面的代码片段:

var dict = request.FrameList 
    .OrderBy(f => f.trueDate) 
    .GroupBy(f => f.type) 
    .ToDictionary(f => f.Key, f => f.ToList()); 
+0

编辑? ;) – 2013-03-18 16:37:32

+0

@lazyberezovsky我很困惑的评论回答:) – 2013-03-18 16:38:04

1

的GroupBy运算符返回IGrouping对象。这些对象具有Key属性。但没有type属性分组对象(这是你的实体的属性):

var dict = request.FrameList 
     .OrderBy(f => f.trueDate) 
     .GroupBy(f => f.type) // this selects IEnumerable<IGrouping> 
     .ToDictionary(g => g.Key, g => g); 

注意:如果这是一个LINQ到实体查询,然后GroupBy返回IQueryable<IGrouping<TKey, TElement>>