2012-06-29 49 views
2

我是Linq的新手。我想知道這是最好的方法,還是有其他方法可以做到這一點。LINQ獲取不同的數據並循環獲取相關數據

我這裏從一個Web服務,我收到的項目清單的要求:

class Item { 

    string ItemName { get; set;} 
    string GroupName { get; set; } 
} 

我收到了以下數據:

ItemName: Item1; GroupName: A 
ItemName: Item2; GroupName: B 
ItemName: Item3; GroupName: B 
ItemName: Item4; GroupName: A 
ItemName: Item5; GroupName: A 

現在,我想所有的獨特的列表中的組,並將所有項目關聯到該組。所以我做了一個班級:

class Group { 
    string GroupName { get; set; } 
    List<string> Items { get; set; } 
} 

所以有一個組和所有關聯的項目將在列表下。

我做了兩個LINQ語句:

var uniqueGroups = (from g in webservice 
     where g.Group != null 
     select g.GroupName).Distinct(); 

然後我遍歷它

foreach (var gn in uniqueGroups) 
{ 
    var itemsAssociated = (from item in webservice 
          where item.GroupName = gn.ToString() 
          select new { 
           }); 
} 

,然後我得到了項目,並將其保存到我的對象。

這是做這件事的最好方法還是有任何LINQ語句可以一次完成所有這些工作?

謝謝。

+0

我認爲如果你說什麼輸出的數據類型可能會更清楚,我的意思是 - 你想要什麼?一個'字典<字符串,列表>'也許?...或? – perfectionist

回答

3

你可以試試這個:

//List<Item> webservice = list with items from your webservice 
var result = (from i in items 
       group i by i.GroupName into groups 
       select new Group() 
       { 
        GroupName = groups.Key, 
        Items = groups.Select(g => g.ItemName).ToList() 
       }).ToList(); 
+0

這是完美的。現在我知道如何在Linq組合。謝謝! – Devmonster

5

聽起來像是你想GroupBy

var itemsByGroup = items.GroupBy(i => i.GroupName); 

foreach (var group in itemsByGroup) 
{ 
    var groupName = group.Key; 
    var itemsForThisGroup = group; 

    foreach (var item in itemsForThisGroup) 
    { 
     Console.Out.WriteLine(item.ItemName); 
    } 
} 
1

可以做一次全部用anonymous typeEnumerable.GroupBy

var groupItems = 
    webservice.Where(i => i.GroupName != null) 
       .GroupBy(i => i.GroupName) 
       .Select(grp => new { Group = grp.Key, Items = grp.ToList() }); 
foreach (var groupItem in groupItems) 
    Console.WriteLine("Groupname: {0} Items: {1}" 
     , groupItem.Group 
     , string.Join(",", groupItem.Items.Select(i => i.ItemName))); 

鮮明的是自以來無用10將永遠使團體不同,這就是團體的本質。

下面是運行代碼:http://ideone.com/R3jjZ

1

我會用:

webservice.ToLookup(k => k.GroupName); 

這將消除對額外類的需要。

希望這會有所幫助!

+0

...它也使用了很少的代碼,我喜歡... – mortb