C# Linq排序、分组和返回字典

C# Linq排序、分组和返回字典,c#,linq,todictionary,C#,Linq,Todictionary,我有一个名为FrameList的自定义对象数组,我可以通过orderBy和GroupBy进行排序和分组。但是现在我想返回一个字典,我得到了一个错误: 顺便说一句,删除.ToDictionary方法没有错误 错误1“System.Linq.iGroup”不存在 不包含“type”的定义,也不包含扩展方法“type” 接受类型为的第一个参数 找不到“System.Linq.IGrouping” 是否缺少using指令或程序集 参考C:\Users\ysg4206\Documents\Visual S

我有一个名为FrameList的自定义对象数组,我可以通过orderBy和GroupBy进行排序和分组。但是现在我想返回一个字典,我得到了一个错误:

顺便说一句,删除.ToDictionary方法没有错误

错误1“System.Linq.iGroup”不存在 不包含“type”的定义,也不包含扩展方法“type” 接受类型为的第一个参数 找不到“System.Linq.IGrouping” 是否缺少using指令或程序集 参考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);
下面是框架列表的定义,它是一个简单的框架数据数组

[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; }
}

假设您的方法签名是IDictionary

尝试使用下一个代码段:

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

假设您的方法签名是IDictionary

尝试使用下一个代码段:

var dict = request.FrameList
    .OrderBy(f => f.trueDate)
    .GroupBy(f => f.type)
    .ToDictionary(f => f.Key, f => f.ToList());
GroupBy操作符返回对象。这些对象具有密钥属性。但分组对象上没有类型属性,它是您实体的属性:

 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

GroupBy操作符返回对象。这些对象具有密钥属性。但分组对象上没有类型属性,它是您实体的属性:

 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

不清楚您要做什么

如果您只是想创建一个惯用的多重映射,请尝试:

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());

不清楚你想做什么

如果您只是想创建一个惯用的多重映射,请尝试:

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());

.ToDictionaryf=>f.Key,f=>f I分组将按类型将元素分组到键中。.ToDictionaryf=>f.Key,f=>f I分组将按类型将元素分组到键中。@lazyberezovsky我被答案的注释弄糊涂了:@lazyberezovsky我被答案的注释弄糊涂了:是的,这就是我要找的。非常感谢。OrderBy不需要对组或命令元素进行排序,而是每个键处的列表都是按日期排序的列表。这就是我要找的。非常感谢。OrderBy不需要对组或命令元素进行排序,而是每个键处的列表都是按日期排序的列表。这就是诀窍。