如何在 LINQ 中分组,然后首先从一组顺序检查中获取组

  • 本文关键字:一组 顺序 获取 LINQ 然后 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,只需抓取任何列表并返回该列表

只需在这些条件下订购。 请注意,订购时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

最新更新