检查可为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>

检查可为null的布尔值是否有值,以及列表中的所有值是否相等

不漂亮,但:

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()