我需要对List<>进行排序按发布日期的MediaItem对象...发布日期不是项目的属性。因此,我的初衷是暂时处理发布日期属性,加载,排序和丢弃属性。有人在我的工作中建议我使用Tuple并使用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));
}
答案 0 :(得分:15)
您可以使用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>>
在这种情况下。在这种情况下,当您添加项目时,它们将始终按排序顺序维护。
答案 1 :(得分:5)
一种方法是使用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 :(得分: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);
}