1

我知道这很简单,但我的大脑现在正在欺骗我。如果我们有一个包含属性 GroupSortIndex 和 ItemSortIndex(在组内)的平面对象列表,并且我们想要找到列表中的第一项,那么 Linq/lambda 是什么?

我能想到的只是(元,而不是文字代码......)

var soughtItem = Source.OrderBy(ItemSortIndex).OrderBy(GroupSortIndex).ToList()[0]

...但是出于某种原因,这对我来说看起来很不对劲。

4

3 回答 3

4

阅读帖子:默认扩展方法以获取 first 和 firstordefault 之间的区别

您可以使用 FirstOrDefualt() 或 First() 函数

var soughtItem = Source.OrderBy(ItemSortIndex).
                   ThenBy(GroupSortIndex).FirstOrDefualt();
if(soughtItem !=null)//advantage of using firstordefault
{
}

它更好用FirstOrDefualt,因为如果没有数据,它将返回 null 而不是 excetipn

于 2012-10-17T19:21:16.750 回答
3
var soughtItem = Source
    .OrderBy(ItemSortIndex)
    .ThenBy(GroupSortIndex).First();

如果ItemSortIndexGroupSortIndex是属性而不是函数,那么您需要:

var soughtItem = Source
    .OrderBy(i => ItemSortIndex)
    .ThenBy(i => GroupSortIndex).First();
于 2012-10-17T19:20:59.283 回答
3

您可以使用IOrderedEnumerable.ThenBy(注意: anIOrderedEnumerable从 中返回IEnumerable.OrderBy):

var firstItem = source.OrderBy(s => s.GroupSortIndex)
                      .ThenBy(s => s.ItemSortIndex)
                      .First();

这首先按组排序,然后按项目排序。FirstOrDefault如果序列可以为空,则应使用。否则First引发异常。

(我假设您想先按组排序,然后按项目排序,因为 ItemSortIndex 是组内项目的索引(如前所述))

于 2012-10-17T19:21:27.007 回答