2010-07-19 90 views
6

我一直在使用101 LINQ Samples讓我的腳使用LINQ溼。這是一個很好的第一資源,但我看不到我目前需要的一個例子。組號的LINQ集團按查詢

我只需要將一個連續的組號碼與每個組相關聯。我有一個工作解決方案:

var groups = 
    from c in list 
    group c by c.Name into details 
    select new { Name = details.Key, DetailRecords = details }; 


int groupNumber = 0; 
foreach (var group in groups) 
{ 
    // 
    // process each group and it's records ... 
    // 

    groupNumber++; 
} 

但是,我敢肯定有可能使用LINQ來生成groupNumber。怎麼樣?

回答

9

這要看您的具體需求,但你可以使用:

var groupArray = groups.ToArray(); 

同樣,你可以使用ToList。這些數據結構是連續的,每個組都有一個索引。


如果你需要創建對象的指數,另一種選擇是使用Select

list.GroupBy(c => c.Name) 
    .Select((details, ind) => 
    new 
    { 
     Name = details.Key, 
     DetailRecords = details, 
     Index = ind 
    }); 
+0

嘿,聰明。我喜歡。 – 2010-07-19 17:17:06

+0

+1 ... clever =) – Luiscencio 2010-07-19 17:18:23

+0

這裏有兩個答案。我喜歡ToList解決方案,但兩個參數選擇正是我所期待的。非常感謝。 – 2010-07-19 17:46:24

6

這應該做的伎倆:

int groupNumber = 0; 
var groups = 
    from c in list 
    group c by c.Name into details 
    select new { Name = details.Key, DetailRecords = details, grpNum = groupNumber++}; 
+0

+1用於關聯GroupNumber和LINQ結果。 – 2010-07-19 17:40:24

1

,如果它只是一個連續的組號,只需使用Count()方法,在你的IEnumerable的。

var groups = 
    from c in list 
    group c by c.Name into details 
    select new {Name = details.Key, DetailRecords = details}; 

for(int i = 0; i < groups.Count(); i++) 
{ 
    //Process Records 
} 

然後,如果您需要特定組號,您可以抓住i

+0

像我的原始解決方案,但更清潔,增量不會在處理代碼中丟失。 – 2010-07-19 17:51:18