c#使用Tuple对List 进行排序?

我需要按发布日期对MediaItem对象的List 进行排序…发布日期不是项目的属性。 因此,我最初的目的是暂时处理发布日期属性,加载,排序和丢弃属性。 有人在我的工作中建议我使用Tuple并使用LINQ进行排序…我在我的片段测试中得到了这个,填写了List …但我不确定如何使用该日期属性进行排序LINQ。 我会一直看着我,但如果有人得到任何帮助我会很感激。 谢谢。

List<Tuple> list = new List<Tuple>(); for (int i = 0; i <= 10; i++) { DateTime date = new DateTime(2011, i, 1); MediaItem item = new MediaItem(); list.Add(new Tuple(item, date)); } 

您可以使用OrderBy( ) LINQ运算符来执行排序; 它允许您传递一个提取元素的函数进行排序。 由于元组的第二个成员是日期,我们按Item2排序。

 var result = list.OrderBy( x => x.Item2 ).ToList(); 

您可以使用OrderByDescending()而不是`OrderBy()来反转LINQ中的顺序。

另外,请注意,您必须具体化结果或迭代它们,因为默认情况下OrderBy()方法是惰性的。 上面的示例实现了列表的副本。

如果要对列表进行排序(而不是创建新列表),可以为Sort()方法提供Comparison委托。

  list.Sort( (a,b) => a.Item2.CompareTo(b.Item2) ); 

但是,您可以做得更好 – 如果您总是希望按排序顺序排列列表,则可以使用SortedList类…但是在这种情况下您必须实现自定义IComparer> 。 在这种情况下,当您添加项目时,它们将始终按排序顺序进行维护。

一种方法是使用List.Sort方法,使用lambda表达式创建适当的Comparison委托。

 // Sorts tuples in chronological order. To use reverse chronological order, // use t2.Item2.CompareTo(t1.Item2) instead. list.Sort((t1, t2) => t1.Item2.CompareTo(t2.Item2)); 

这当然假设列表中没有空引用,在您的示例中不存在。

 List> list = new List>(); for (int i = 0; i <= 10; i++) { DateTime date = new DateTime(2011, i, 1); MediaItem item = new MediaItem(); list.Add(new Tuple(item, date)); } list.Sort((a, b) => a.Item2.CompareTo(b.Item2)); foreach (var element in list) { Console.WriteLine(element); }