2012-08-29 73 views
1

我有一個IList項目列表<>。每個listitem有一個日期和一些其他字段。 我需要按日期排列列表,然後將列表更改爲僅顯示第一個項目的日期,如果日期重複,則將其他項目的日期字段有效設置爲空。Linq GroupBy改變列表

實施例:

12/01/2012 500 
12/01/2012 700 
15/02/2012 900 
15/02/2012 1100 
27/05/2012 2000 

所需的結果:

12/01/2012 500 
null  700 
15/02/2012 900 
null  1100 
27/05/2012 2000 

這是可能與由LINQ組和爲了通過?

謝謝

回答

0

LINQ操作員不應該更改基礎數據。如果您要修改數據,最好使用常規的foreach

這應該可能工作:

var groups = items.GroupBy(x => x.Date).ToArray(); 
foreach (var group in groups) 
{ 
    foreach (var item in group.Skip(1)) item.Date = null; 
} 

我會避免使用這樣的結構,因爲你必須仔細檢查GroupBy保持秩序。相反,我會用這樣的:

var sortedItems = items.OrderBy(x => x.Date); 
var lastVisitedDate = (DateTime?) null; 
foreach (var item in sortedItems) 
    if (Equals(item.Date, lastVisitedDate)) item.Date = null; 
    else lastVisitedDate = item.Date; 
+0

我沒有通過使用組,我會很快嘗試,但分揀運作良好。謝謝! –

0

這應該工作:

var list = new List<DateItem>(); 
// Initialization ... 
var dups = list.Select((Item,Index) => new{ Item,Index }) 
       .GroupBy(x => x.Item.Date) 
       .Where(g => g.Count() > 1); 
foreach(var dup in dups) 
{ 
    foreach (var nullable in dup.OrderBy(x => x.Item.Date).Skip(1)) 
    { 
     list[nullable.Index].Date = null; 
    } 
} 

假設你的類看起來與此類似:

class DateItem { 
    public DateTime? Date; 
    public int OtherField; 
} 

編輯:這裏有一個工作演示: http://ideone.com/cVL4G

0

單程t Ø在循環使用LINQ來獲取所有的追隨者,然後設置其日期爲null:

// Use ToList() to make sortedItems non-lazy so it won't get ordered each time it's called. 
var sortedItems = items.OrderBy(x => x.Date).ToList(); 
var followers = sortedItems.GroupBy(item => item.Date) 
          .SelectMany(group => group.Skip(1)); 
foreach (var follower in followers) 
{ 
    follower.Date = null; 
} 
// Now you can use sortedItems. 

或者,如果你喜歡的查詢語法:

var followers = from item in sortedItems 
       group item by item.Date into grp 
       from follower in grp.Skip(1) 
       select follower;