如何在LINQ中进行分组,然后从一组连续的检查中首先从组中获取

时间:2018-05-23 14:53:02

标签: c# linq

我有一个对象列表,并且想要获取符合特定条件的第一个对象,但是如果不满足该条件,我想匹配下一个条件,然后最终得到一个"默认"

这是我的对象定义:

public myObject{
    int id { get ; set ;}
    int type { get ; set ;}
    subObjectWithLotsOfProperties { get ; set ;}
 }

我有我的对象列表,想要浏览它。 如果我知道我的类型按照我的规则下降了,那么以下内容就可以满足我的需要

 myList = myList
         .GroupBy(x => x.id,(key, y) => y.OrderByDescending(z=>z.type).FirstOrDefault());

我的规则应该是以下内容:

  1. 分组我的清单
  2. 为每个组取列表中的第一项 匹配类型为27
  3. 如果找不到匹配27的项目,请抓住 类型为14的项目
  4. 如果找不到匹配14或27的项目, 抓住类型为50的项目
  5. 如果找不到匹配14,27的项目, 或50,只需抓住任何一个列表并返回那个

1 个答案:

答案 0 :(得分:3)

按照这些条件订购。请注意,false在订购时true之前。

myList.GroupBy(
    x => x.Id, 
    (key, y) => y.OrderBy(z => z.type != 27)
                 .ThenBy(z => z.type != 14)
                 .ThenBy(z => z.type != 50)
                 .First());

那将首先排序类型为27的项目,然后是14,然后是50,然后是其他所有项目。拿第一个会给你一个27,如果有一个,如果没有一个14如果有一个,如果没有那个然后一个50,如果没有一个随机的。请注意,您不需要FirstOrDefault,因为GroupBy将始终创建包含至少一个项目的组。

此外,如果您愿意,可以将比较更改为==并改为使用OrderByDescendingThenByDescending