2011-11-03 22 views
4

我试图找到我的问题的答案,但我被困住了。 我有数组的集合,并需要删除某些属性相同的记录。C#从数组集合中删除“部分”副本

例如: 我有属性 - 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相同且价格不是最低的记录。 在这个例子中,删除的记录将是第一个。

感谢任何帮助或建议

回答

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(); 
+0

哇,我打字几乎完全相同的答案,但你也打败了我呢......哈哈...... –

+0

非常感谢,这似乎是我需要的。我只是不知道如何访问这些属性的名称,因为它没有在任何地方定义。我只是知道什么是位置0等价值的意义等 – Petr

+0

非常感谢,我改变了一些mz代码,现在它工作顺利 – Petr