2012-01-24 35 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

相關問題