检查可为null的布尔值是否有值,以及列表中的所有值是否相等
本文关键字:是否 列表 布尔值 检查 null | 更新日期: 2023-09-27 18:21:09
我在列表中有一个对象的布尔属性,可以为null,我想检查所有对象是否相等并返回其值,如果有不相等的值,则返回null。
例如
Object1
string Name
bool? NullBool
Object1在列表中,例如List<Object1>
,我只需要使用Linq 检查并返回NullBool
我想做一些类似的事情
bool? returnVal = <my Linq / Function to get what I want>
不漂亮,但:
IEnumerable<Object1> objects = ...
var firstTwoDistinctValues = objects.Select(o => o.NullBool)
.Distinct()
.Take(2) // Early exit
.ToList();
var result = firstTwoDistinctValues.Count == 2
? null : firstTwoDistinctValues.SingleOrDefault();
现在这非常有效,因为:
- 它不需要多次枚举源集合即可工作。当源是列表时,这并不是什么大不了的事,但如果源是一个昂贵/不确定的查询,这可能很重要
- 如果存在不止一个唯一值,它会提前退出
此外,当源集合为空时,它将正常工作。
对于列表,您还可以高效地执行:
IList<Object1> objects = ...
var firstNullBool = objects.Select(o => o.NullBool).FirstOrDefault();
var result = objects.All(o => o.NullBool == firstNullBool) ? firstNullBool : null;
var result = list.Select(elem => elem.NullBool).DefaultIfEmpty()
.Aggregate((acc, elem) => acc == elem ? acc : null);
你在想这句话吗?
public static bool? CheckIfAllAreTheSame(List<Object1> bools)
{
if (bools.All(b => b.NullBool == true))
return true; // ... they are all true;
if (bools.All(b => b.NullBool == false))
return false;// ... they are all false
return null;// ... they are not all the same...
}
var thing = (from x in objects where (x.NullBool.HasValue
&& x.NullBool.Value == whatever) select x).FirstOrDefault()