C#从数组集合中删除“部分”重复项

时间:2011-11-03 15:51:04

标签: c# collections duplicates

我试图找到问题的答案,但我被困了。 我有数组的集合,需要删除某些属性相同的记录。

实施例: 我有属性 - BeginTime,EndTime,Date,Price。

07:00, 11:00, 2011-11-14, 90
08:00, 12:00, 2011-11-14, 110
07:00, 11:00, 2011-11-15, 120
07:00, 11:00, 2011-11-14, 50

我想删除BeginTime,EndTime和Date相同且Price不是最低的记录。 在此示例中,删除的记录将是第一个。

感谢您的任何帮助或建议

1 个答案:

答案 0 :(得分:6)

LINQ怎么样:

IEnumerable<Bar> bars = ...

var lowestPriceBars = bars.GroupBy(bar => new { bar.BeginTime, bar.EndTime, bar.Date } )
                          .Select(g => g.OrderBy(bar => bar.Price).First())
                          .ToArray();

这通过将具有相同时间戳的项目分组在一起然后从每个组生成具有最小价格的项目来工作。请注意,如果组中的多个项目具有相同的最低价格,则查询将任意保留其中一个项目。

另请注意,使用MinBy运算符(例如来自更多morelinq的运算符),您可以通过以下方式提高Select运算效率:

.Select(g => g.MinBy(bar => bar.Price))

编辑:如果您想保留所有价格最低的商品,您可以这样做:

var lowestPriceBars = bars.GroupBy(bar => new { bar.BeginTime, bar.EndTime, bar.Date })
                          .SelectMany(timeGroup => timeGroup
                                                   .GroupBy(bar => bar.Price)
                                                   .OrderBy(priceGroup => priceGroup.Key)
                                                   .First())
                          .ToArray();