如何按每个对象的成员对对象列表进行排序? [复制]
Posted
技术标签:
【中文标题】如何按每个对象的成员对对象列表进行排序? [复制]【英文标题】:How can I sort a list of objects by a member of each object? [duplicate] 【发布时间】:2013-09-23 13:32:50 【问题描述】:class candle
public DateTime date get; set;
public double open get; set;
public double high get; set;
public double low get; set;
public double close get; set;
List<candle> candleList = new List<candle>();
假设我在 candeList 中添加了许多蜡烛,那么如何按日期对蜡烛列表进行排序?
另外,如何从candleList 中删除所有重复的条目?
谢谢
【问题讨论】:
candleList.OrderBy(x=>x.date)
:)
两个相关的问题:1)你想对列表本身进行排序还是对排序后的输出进行迭代? 2) 你如何认为两个candle
实例相等?
【参考方案1】:
相当标准,简单的 linq。
var candleList = candleList.Distinct().OrderBy(x => x.date).ToList();
正如亚当下面提到的,这只会删除列表中的重复实例,而不是所有相同属性值的实例。
您可以实现自己的IEqualityComparer<Candle>
作为通过此选项的选项。 IEqualityComparer
您可能想看看 msdn,并阅读 Linq 和 Enumerable Methods: MSDN - Enumerable Methods
【讨论】:
Distinct
在一个类上只会做引用相等,而不是属性值。此外,这种排序不是就地的,它会产生一个IEnumerable
。
@AdamHouldsworth,您的观点非常有效且相关。但这并没有使我的回答不正确(这是给反对者的)。我提供了更多信息。
我注意到了,我不是反对者。【参考方案2】:
如果您使用的是 .NET 3.5 及更高版本,则可以像这样在 IList 上使用 OrderBy 扩展:
var orderList = candleList.OrderBy(s => s.date);
您可以使用 SortBy 替代方法
var orderList = candleList.SortBy((x, y) => x.date.CompareTo(y.date) );
要删除重复项,您可以这样做:
var distinctList = orderList.GroupBy(x => x.date).Select(grp => grp.First());
终于又能拿到名单了
var finalList = distinctList.ToList();
流利的方式:
List<candle> finalList = candleList.OrderBy(s => s.date).Distinct().ToList();
顺便说一句,*** 中还有很多其他问题可以解释每个问题,搜索它们,您会找到其他详细信息。
【讨论】:
【参考方案3】:我怎样才能按日期对蜡烛列表进行排序?
var orderedList = candleList.OrderBy(p=>p.date);
另外,如何从candleList 中删除所有重复的条目?
您应该告诉我们您如何比较两个candle
对象。假设date
你可以这样做:
var uniqueList = candleList.GroupBy(p=>p.date).Where(p=>p.Count() == 1).ToList();
此外,您可以使用Distinct()
或在此方法中引入IEqualityComparer<candle>
来比较两个蜡烛对象并删除重复项。
【讨论】:
以上是关于如何按每个对象的成员对对象列表进行排序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章