2011-11-15 12 views
8

今日私は、誤字によりポップアップしたオブジェクト(SQLではない)に対してLINQの問題が発生しました。私は.Selectを1か所、.Whereを別の場所に持っていました。私は同じ結果を期待していたが、彼らは異なる数字を示している。想定somelistを選択し、リターンIEnumerable<T>なぜあいまいさの両方の場合= 0qtylinqのあいまいさはどこにありますか

//returns 10 - basically count of all rows. I am expecting 0 
somelist.Select(p => p.qty > 0).Count() 

//returns 0 - the correct count 
somelist.Where(p => p.qty > 0).Count() 

を持つすべての要素を持つ10個の要素を持っていますか?ありがとうございました。

+0

linq 101アップデートの皆さん。 – Gullu

+0

これは興味深い命名問題の1つです.C#はsql(SQLでは列を選択することを示唆しています)のように構文的にしようとしていますが、特に述語を入れた場合は「Select」という名前は、 'select'メソッドが行うものである、実際にルビーとスモールトークの中を通過するものです。 – jbtule

答えて

18

Selectは投影ですので、の式はsomelistの各要素について評価されます。つまり、多数の真偽値(元のリストと同じ番号)を返します。したがって、Countを実行すると、同じ番号が得られます。あなたが見た場合、IEnumerable<bool>p.qty > 0のタイプはブールなので)を返します。

Whereはフィルタリングされたリストでカウントが実行されるように結果をフィルタリングし、期待される結果を提供します。これのタイプはIEnumerable<TypeOfElementInOriginalList>です。

また、somelist.Count(p => p.qty > 0)には、フィルタする述語を受け入れるoverloadがあるため、somelist.Count(p => p.qty > 0)があることに注意してください。

2

最初のクエリはsomelist.Count()と同じです。シーケンス内の要素の数だけです。 Selectへの呼び出しはそれぞれオブジェクトを投影しますが、オブジェクトの数は変わりません。

2番目のクエリは、述語を満たす要素の数を示します。これは、潜在的に低い数値です。シーケンスからのWhereフィルタオブジェクトの呼び出し。

0

最初のクエリは、ブール値のIEnumerableを返します。

2番目のクエリは、ブール式に一致する元の要素のみを返します。

0

最初のステートメントは、boolのIEnumerableを作成します。qtyフィールド> 0です。レコードが10個あるため、10個のboolが作成されます。

2つ目は、条件でフィルタリングされたIEnumerableを返します。

関連する問題