2012-08-29 30 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;