使用元组对List<>进行C#排序?

8
我需要按发布日期对MediaItem对象的List<>进行排序,但发布日期不是该项的属性。 因此,我的初始意图是暂时附加一个发布日期属性,加载它们,排序并丢弃该属性。 我工作中的某人建议我使用元组并使用LINQ进行排序...在我的片段测试中,我已经做到了这一点,填充了List<>...但我不确定如何使用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));
            }
3个回答

18

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

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

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

此外,请注意您必须要么使结果成为实体对象或者遍历结果,因为OrderBy()方法默认是按需查询的。上面的示例是将列表复制成实体对象。

如果您想就地对列表进行排序(而不是创建一个新的列表),则可以向Sort()方法提供一个Comparison<T>委托。

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

然而,你可以做得更好 - 如果你总是想保持列表的排序顺序,你可以使用SortedList类……但在这种情况下,你必须实现一个自定义的IComparer<Tuple<MediaItem, DateTime>>。在这种情况下,当你添加项时,它们将始终保持排序顺序。


6

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

// 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));

当然,这假定列表中没有空引用,而在你的示例中不可能存在空引用。

2
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));
 }

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

foreach (var element in list)
{
    Console.WriteLine(element);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接