2009-08-14 70 views
0

爲了簡化場景,假設我們有一個包含名字和姓氏屬性的人員列表。使用LINQ將組增加的屬性添加到IEnumerable組中使用LINQ

我們的數據是這樣的:

Bob Smith 
Jane Smith 
Todd Grover 
Larry Lewis 
Jill Lewis 
Frank Lewis 

的第一步是添加一個被遞增爲每個項目整數屬性:

Bob Smith 1 
Jane Smith 2 
Todd Grover 3 
Larry Lewis 4 
Jill Lewis 5 
Frank Lewis 6 

理想情況下,我想重置計數器爲每個新組達成此目的:

Bob Smith 1 
Jane Smith 2 
Todd Grover 1 
Larry Lewis 1 
Jill Lewis 2 
Frank Lewis 3 

也許LINQ並不合適。看起來LINQ似乎應該能夠做到這一點。

+0

這是有史以來第一次,我知道事情做在普通的SQL中,但不是在C#中(讀作「不像使用Linq那樣快)」 – nawfal 2012-11-25 21:20:20

回答

5

如果只是希望計數器隨每個項目遞增:

var query = people 
    .Select((x, i) => new { x.FirstName, x.LastName, Index = i + 1 }); 

或者,如果要重置爲每個組櫃檯,LastName分組:

var query = people 
    .GroupBy(x => x.LastName) 
    .Select 
    (
     x => x.Select((y, i) => new { y.FirstName, y.LastName, Index = i + 1 }) 
    ) 
    .SelectMany(x => x); 

,並迅速顯示查詢結果:

foreach (var item in query) 
{ 
    Console.WriteLine(item.FirstName + "\t" + item.LastName + "\t" + item.Index); 
} 
1

假設已經有一個整數財產上的記錄類型,集合已經排序,那麼你就可以濫用骨料(即左倍),像這樣

collection.Aggregate((old, next) => { if (namesDiffer(old, next)) next.Index = 1 else next.Index = old.Index +1; return next;}, aRecordWithEmptyName); 

編輯 - 固定回報值;手指一直在自動駕駛儀上。

2

可以使用Select方法,該方法結合了傳遞給lambda表達式索引參數,例如所述第二過載:

var people = new [] { 
    new { FirstName = "Bob", LastName = "Smith"}, 
    new { FirstName = "Jane", LastName = "Smith"}, 
    new { FirstName = "Todd", LastName = "Grover"}, 
    new { FirstName = "Larry", LastName = "Lewis"}, 
    new { FirstName = "Jill", LastName = "Lewis"}, 
    new { FirstName = "Frank", LastName = "Lewis"}, 
}.ToList(); 

people.Select((p, index) => new { 
            FirstName = p.FirstName, 
            LastName = p.LastName, 
            Index = index 
           } 
      ); 

結果:

select-index