2012-01-24 42 views
2

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

例如

Object1 
    string Name 
    bool? NullBool 

对象1在列表中,例如, List<Object1>,我只需要检查和使用返回NullBool的LINQ

我要像做

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

检查所有的东西都是平等的吗?所有的布尔值是相等的? – sblom

+0

是的,我只是想返回一个可为null的布尔值,而不是一个可为null的布尔值列表。 –

+2

获取NullBool的独特性,如果全部相同,您应该只获得一条记录:) – V4Vendetta

回答

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

现在,这是非常有效的,因为:

  • 它不需要多次枚举source-collection。当源是一个列表时,这并不是什么大不了的事,但如果源是一个昂贵的/非确定性的查询,这可能很重要。
  • 如果超过唯一值,它会提前退出。

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

有关列表,还可以有效地做到:

IList<Object1> objects = ... 

var firstNullBool = objects.Select(o => o.NullBool).FirstOrDefault(); 
var result = objects.All(o => o.NullBool == firstNullBool) ? firstNullBool : null; 
+1

什么是'拿(2)'作为? –

+0

@rob:这是一种优化 - 如果发现多个不同的值,则提前退出 - 结果肯定会为空,因此没有进一步列举的点。 – Ani

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

ahhh是的,我认为这是我需要的。稍后再回来看看。 –

+0

刚刚提到它:如果列表为空,这将返回“true”,所以如果这不是期望的行为,则需要相应地修改该函数。 – Nailuj

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

什么是“什么”? – sblom

+0

无论你想比较(例如,真或假), - 例如得到每个可为空的布尔是真的, – IanNorton

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

+1:非常优雅。尽管我会更好地处理空序列。另外,很遗憾,我们无法通过'Aggregate'提前退出。 – Ani

+0

@Ani,很好的建议 - 增加了一个空的列表检查。耻辱我想不出任何比'?:'更为滑稽的东西...... – sblom

+0

我会这样做:'list.Select(elem => elem.NullBool).DefaultIfEmpty()。Aggregate((acc,elem)=> acc == elem?acc:null)' – Ani

相关问题