如何使用LINQ按多个项目订购?

时间:2011-07-29 12:44:36

标签: c# linq collections

我有一个集合,我正在尝试根据以下代码获取集合中的“最新”项目:

 return MyCollection.OrderByDescending(a => a.StartDate).FirstOrDefault(a => a.StartDate.Date <= DateTime.UtcNow.Date));

这很好但我遇到了一个问题,我有一个例子,MyCollection中有两个具有相同开始日期的条目。 (所以我认为任意选择其中一个?)

要处理这种情况,我想为此添加一个检查,这样如果有多个项目具有相同的startdate,那么它会转到另一个字段来决定返回哪个但我不想要支付费用除非情况存在,否则检查第二个字段。

4 个答案:

答案 0 :(得分:12)

使用ThenBy()ThenByDescending()

return MyCollection.OrderByDescending(a => a.StartDate).ThenBy(a=>a.Fish).FirstOrDefault(a => a.StartDate <= DateTime.UtcNow.Date));

如您所希望的项目具有最新日期....

var max=MyCollection.Where(a => a.StartDate.Date <= DateTime.UtcNow.Date).Max(a=>a.StartDate);
result=MyCollection.Where(a=>a.StartDate == max).OrderBy(a=>a.SecondProp).First();

答案 1 :(得分:1)

您应该会发现ThenBy / ThenByDescending扩展程序。

答案 2 :(得分:1)

如果您使用的是ThenBy(),则会始终执行。只有当OrderBy的结果相同时才执行'ThenBy'的唯一方法是,您必须编写自定义IComparer

答案 3 :(得分:0)

你可以让你的对象支持IComparable,把你的逻辑放在那里然后按对象本身排序.OrderBy( a => a )

(我认为这样做......否则你可以将实现IComparer的对象传递给OrderBy)