Linq排序,分组,并返回一个字典

本文关键字:一个 字典 返回 排序 分组 Linq | 更新日期: 2023-09-27 18:04:26

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

(顺便说一句,没有错误是我删除了。todictionary()方法。)

错误1 'System.Linq。IGrouping "不包含'type'的定义和'type'的扩展方法接受类型的第一个参数"来。可以找到IGrouping(您是否缺少using指令或程序集参考?)C:'Users'ysg4206'Documents'Visual工作室2010'Projects'Watson' catalogserviceclass '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; }
}

Linq排序,分组,并返回一个字典

不清楚你想做什么

如果你只是想创建一个习惯用法的多映射,试试:

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是无用的,因为Lookup和Dictionary本质上是无序集合。如果您想通过订购完成某些任务(也许您希望按日期订购组内的项目?),请澄清,我们可能能够提供更合适的内容。

编辑:根据你的评论,看起来你需要:

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

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

尝试使用下一个代码片段:

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

GroupBy操作符返回igrouing对象。这些物体具有Key性质。但是没有type属性在分组对象(你的实体的属性):

 var dict = request.FrameList
        .OrderBy(f => f.trueDate)
        .GroupBy(f => f.type) // this selects IEnumerable<IGrouping>
        .ToDictionary(g => g.Key, g => g);
注意:如果这是一个实体关联查询,那么GroupBy返回IQueryable<IGrouping<TKey, TElement>>