1

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

例子:

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 这可能吗?

谢谢

4

3 回答 3

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;
于 2012-08-29T14:38:28.943 回答
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

于 2012-08-29T14:38:32.360 回答
0

一种方法是使用 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;           
于 2012-08-29T15:59:29.467 回答