我在列表中有一个对象的可空布尔属性,我想检查所有对象是否相等并返回其值,如果值不相等则返回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();

现在这非常有效,因为:
  • 它可以不枚举多次源集合而工作。当源是列表时,这并不是什么大问题,但如果源是昂贵/不确定的查询,则可能很重要。
  • 如果值超过唯一值,它将提前退出。

  • 此外,当source-collection为空时,它将正常工作。

    对于列表,您还可以有效地执行以下操作:
    IList<Object1> objects = ...
    
    var firstNullBool = objects.Select(o => o.NullBool).FirstOrDefault();
    var result = objects.All(o => o.NullBool == firstNullBool) ? firstNullBool : null;
    

    09-13 13:43