Linq GroupBy将更改列表

Linq GroupBy将更改列表,linq,list,group-by,sql-order-by,Linq,List,Group By,Sql Order By,我在IList中有一个项目列表。每个列表项目都有一个日期和一些其他字段。 我需要按日期对列表排序,然后将列表更改为仅显示第一个项目的日期,如果重复日期,则有效地将其他项目的日期字段设置为null 例如: 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/

我在IList中有一个项目列表。每个列表项目都有一个日期和一些其他字段。 我需要按日期对列表排序,然后将列表更改为仅显示第一个项目的日期,如果重复日期,则有效地将其他项目的日期字段设置为null

例如:

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 group by和order by是否可以这样做


谢谢

LINQ操作符不应该更改基础数据。如果要修改数据,最好使用regular
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;
这应该起作用:

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; 
    }
}

编辑:这里有一个工作演示:

一种方法是使用LINQ获取所有追随者,然后在循环中将他们的日期设置为空:

// 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;           

我没有使用分组方式,我很快会尝试,但排序效果很好。谢谢
var followers = from item in sortedItems
                group item by item.Date into grp
                from follower in grp.Skip(1)
                select follower;