2012-01-24 11 views
2

私はリスト内のオブジェクトのnullableブール値のプロパティを持っていますが、すべてが等しいかどうかチェックしてその値を返したい場合は値を返し、それは等しくない。nullable booleanが値を持ち、すべてがリストから等しい場合

Object1 
    string Name 
    bool? NullBool 

Object1がリストに含まれています。 List<Object1>と私はちょうど私が

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

チェック!すべてのブール値が等しいことは? – sblom

+0

はい、nullableブール値のリストではなく、null可能ブール値を返すだけです。 –

+2

NullBoolのための別名を取得します。すべて同じであれば、1つのレコードを取得する必要があります:) – V4Vendetta

答えて

3

きれいではありませんのような何かをしたいのLINQ

をチェックし、使用してNullBoolを返却する必要がありますが、:

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

'Take(2)'は何のためですか? –

+0

@rob:これは最適化です。複数の別個の値が見つかると、早期に終了します。結果は確実にnullになるため、さらに列挙する必要はありません。 – 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

はい、私はこれが私の必要と思うものだと思います。後であなたに確認してください。 –

+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()。集計((acc、elem)=> acc == elem?acc:null) ' – Ani

関連する問題