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