时间:2019-03-07 标签:c#listsorting<>使用元组?
我需要对 List<> 进行排序按发布日期排列的 MediaItem 对象...发布日期不是项目的属性。所以我最初的意图是暂时附加一个发布日期属性,加载它们,排序,然后放弃该属性。我工作中的某人建议我使用 Tuple 并使用 LINQ 进行排序...我已经在我的代码片段测试中完成了这一点,填充了列表<>...但我不确定如何按该日期属性进行排序使用 LINQ。我会继续寻找,但如果有人能提供任何帮助,我将不胜感激。谢谢。
List<Tuple<MediaItem, DateTime>> list = new List<Tuple<MediaItem, DateTime>>();
for (int i = 0; i <= 10; i++)
{
DateTime date = new DateTime(2011, i, 1);
MediaItem item = new MediaItem();
list.Add(new Tuple<MediaItem, DateTime>(item, date));
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用
OrderBy( )
LINQ 运算符来执行排序;它允许您传递一个函数来提取要排序的元素。由于元组的第二个成员是日期,因此我们按Item2
排序。您可以使用
OrderByDescending()
而不是 `OrderBy() 来反转 LINQ 中的排序。另请注意,您必须具体化结果或迭代它们,因为默认情况下
OrderBy()
方法是惰性的。上面的示例具体化了列表的副本。如果您想就地对列表进行排序(而不是创建新列表),您可以向 Comparison 委托/en-us/library/w56d4y5z.aspx" rel="noreferrer"> 方法。
Sort()
但是,您可以做得更好 - 如果您始终希望按排序顺序维护列表,则可以使用 SortedList 类,但是在这种情况下,您必须实现自定义
IComparer>
。在这种情况下,当您添加项目时,它们将始终按排序顺序维护。You can use the
OrderBy( )
LINQ operator to perform the sorting; it allows you to pass a function which extracts the element to sort by. Since the second member of the tuple is the date, we order byItem2
.You can reverse the ordering in LINQ by using
OrderByDescending()
instead of `OrderBy().Also, note that you must either materialize the results or iterate over them, as the
OrderBy()
method is lazy by default. The example above materializes a copy of the list.If you want to sort the list in place (rather than create a new one), you can supply a
Comparison<T>
delegate to theSort()
method.However, you can do even better - if you always want to main the list in sorted order, you can use the SortedList class instead ... however you will have to implement a custom
IComparer<Tuple<MediaItem, DateTime>>
in that case. In this case, when you add items they will always be maintained in sorted order.一种方法是使用
List.Sort
方法,使用 lambda 表达式创建适当的Comparison
委托。当然,这假设列表中没有空引用,而您的示例中不可能有空引用。
One way would be to use the
List<T>.Sort
method, using a lambda-expression to create the appropriateComparison<T>
delegate.This of course assumes that there are no null-references in the list, which there can't be in your example.