2017-10-04 99 views
0

起初,我有一个项目清单:LINQ:转换分组列表进入新的名单

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

我需要组mySourceList的ProviderID和日期,所以我做如下:

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

然后我在这个分组名单进行一些opertions:

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框架3.5 SP1

回答

3

使用SelectMany扩展方法。
grpIEnumerable<IGrouping<'a, Item>>类型 - 所以它是某种列表的列表。
而且你需要所有物品的退货清单。

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

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

+0

最后我有循环的令牌优势,请参阅我的答案。无论如何,你的解决方案完美工作,我喜欢它。 – user1624552

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; 

法比奥解决方案也适用。