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

时间:2017-10-04 07:19:48

标签: c# list linq visual-studio-2008 group-by

最初我有一个项目列表:

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

我需要按ProviderID和Date对mySourceList进行分组,所以我在下面这样做:

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

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

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

如何转换为List?

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

2 个答案:

答案 0 :(得分:3)

使用SelectMany扩展程序。
grp属于IEnumerable<IGrouping<'a, Item>>类型 - 因此它是某种列表清单 而且你需要返回所有项目的扁平列表。

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

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

答案 1 :(得分:0)

我在下面通过利用操作来更新循环中的分组列表:

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解决方案也有效。