我有一个对象列表,并希望采用与某个条件匹配的第一个对象,但是如果不满足该条件,我想匹配下一个条件,然后最终有一个"默认值">
这是我的对象定义:
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());
我的规则实际上应该是以下内容:
- 对我的列表进行分组
- 对于每个组,取列表中的第一项 与类型 27 匹配
- 如果未找到与 27 匹配的项目,请抓取 类型 14 的项目
- 如果未找到与 14 或 27 匹配的项目, 抓住类型 50 的物品
- 如果未找到与 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
将始终创建至少包含一个项目的组。
此外,如果需要,您可以将比较更改为==
并使用OrderByDescending
和ThenByDescending
。