0

LINQ を介してリスト内の項目を制限する方法があります。このリストには、bool_a と bool_b の 2 つのブール型プロパティを持つアイテムが含まれています。このリストには、bool_a が true で bool_b が false であるアイテムと、両方が false であるアイテムが含まれています。

リストを制限すると、bool_a が false であるレコードのみが残り、bool_a と bool_b の両方が false であるすべてのアイテムが削除されることを期待しています。ただし、すべてのアイテムが削除されていることがわかりました。AND 演算子が OR のように動作しているように見えます。

以下に例を示します。何が表示されないのですか?

var records = GetRecords();
var count_where_a_before = records .Where(x => x.bool_a); // 100 items
var count_where_ab_before = records .Where(x => x.bool_a && x.bool_b); // 10 items
records = records.Where(x => !x.bool_a && !x.bool_b);
var count_where_a_after = records .Where(x => x.bool_a); // 0 items

上記からわかるように、リストを評価するために where 句の前後にカウントを使用しています。

4

4 に答える 4

3

この行

records = records.Where(x => !x.bool_a && !x.bool_b);

結果として、レコードには!x.bool_aを持つアイテムのみが含まれるため、論理的には次の行にはx.bool_aアイテムがありません。

これは、すべてのx.bool_bがfalseであると述べているため、真です。したがって、ステートメントは実際には次のようになります。

records = records.Where(x => !x.bool_a);

編集:

bool_aがtrueでbool_bがfalseであるすべてのレコードが必要な場合は、このクエリを使用できるはずです。

records = records.Where(x => x.bool_a && !x.bool_b);
于 2012-10-16T21:34:01.090 に答える
1

bool_aとbool_bの両方がfalseであるすべてのアイテムを削除する場合は、次のことを行う必要があります。

records = records.Where(x => x.bool_a || x.bool_b);
于 2012-10-16T21:40:19.070 に答える
0

使用している次のフィルターは、AとBの両方がFALSEであるアイテムのみを残します。

records = records.Where(x => !x.bool_a && !x.bool_b);

AがTRUEでBがfalseのレコードのみを保持する場合は、次を使用します。

records = records.Where(x => x.bool_a && !x.bool_b);

最後に、チェックしているのは、A=TRUEのレコードの数です。

var count_where_a_after = records .Where(x => x.bool_a);

これがあなたがチェックしたいものであることを確認してください。

于 2012-10-16T21:35:43.330 に答える
-1

試す:

var records = GetRecords().Where(!(x => x.bool_a && x.bool_b)); 
于 2012-10-16T21:32:42.207 に答える