代码之家  ›  专栏  ›  技术社区  ›  Willy

LINQ:将分组列表转换为新列表

  •  0
  • Willy  · 技术社区  · 7 年前

    最初,我有一个项目列表:

    List<Item> mySourceList;
    

    哪项是:

    项目类别

    public class Item
    {
       public DateTime Date
       {
         get;
         set;
       }
       public string ProviderID
       {
         get;
         set;
       }    
       public List<AnotherClass> listOfitems
       {
         get;       
         set;
       }
       public byte[] Img
       {
         get;
         set;
       }
       // Other properties
    
       public long GroupID
       {
         get;
         set;
       }
    }
    

    我需要按提供者ID和日期对我的资源列表进行分组,所以我做了以下工作:

    var grp = mySourceList .GroupBy(e => new { e.ProviderID, e.Date });
    

    int groupId = 1;
    foreach (var group in grp)
    {
        int id = group.Count() > 1 ? groupId++ : 0;
    
        // Loop through each item within group
        foreach (var item in group)
            item.GroupID = id;
    }
    

    最后,我正在尝试将我的资源列表转换为一个新列表,这个新列表必须再次成为列表,所以我在下面尝试,但它不起作用:

    List<Item> myDestList = grp.ToList<Item>();
    

    我正在使用Visual Studio 2008和NET Framework 3.5 SP1

    2 回复  |  直到 7 年前
        1
  •  3
  •   Fabio    7 年前

    使用 SelectMany 扩展方法。
    grp 属于类型 IEnumerable<IGrouping<'a, Item>> -所以它是某种列表。
    您需要返回所有项目的扁平列表。

    List<Item> myDestList = grp.SelectMany(g => g).ToList();
    

    另一种方法是使用原始列表,因为您的代码更新了已经存在的项。

        2
  •  0
  •   Willy    7 年前

    我利用更新循环中分组列表的操作完成了以下工作:

    List<Item> groupedList = new List<Item>();
    
    int groupId = 1;
    foreach (var group in grp)
    {
        int id = group.Count() > 1 ? groupId++ : 0;
    
        // Loop through each item within group
        foreach (var item in group)
        {
            item.GroupID = id;
            groupedList.add(Item);
        }
    }
    
    myDestList = groupedList;
    

    Fabio解决方案也有效。