检查nullable boolean是否具有值以及是否所有值都与list相等

时间:2012-01-24 06:58:27

标签: c# linq c#-4.0

我有一个列表中对象的可以为空的布尔属性,我想检查是否所有都相等并返回其值,如果有一个不相等的值,则返回null。

e.g。

Object1
    string Name
    bool? NullBool

Object1在列表中,例如List<Object1>我只需要使用Linq检查并返回NullBool

我想做点什么

bool? returnVal = <my Linq / Function to get what I want>

4 个答案:

答案 0 :(得分:3)

不漂亮,但是:

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;

答案 1 :(得分:3)

var result = list.Select(elem => elem.NullBool).DefaultIfEmpty()
                 .Aggregate((acc, elem) => acc == elem ? acc : null);

答案 2 :(得分:0)

你是否正在考虑这个问题?

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...
}

答案 3 :(得分:0)

var thing = (from x in objects where (x.NullBool.HasValue 
   && x.NullBool.Value == whatever) select x).FirstOrDefault()