1

次のコードがあります

return lStoredRecords.Select(u => 
                                 u.sCardId == sCardId && 
                                 u.rtMode == eRecordType &&
                                 u.dtTime >= DateTime.Now.AddMinutes(-15.0)).Any();

しかし、何らかの理由で常に返さTrueれ、

lStoredRecordsdtTime 上記の条件を満たさないような1つのレコードが含まれているため、上記のコード行が返されることを期待していましたFalse

何か案は?

4

3 に答える 3

7

まず、なぜ使用しているのかがまったくわかりませんSelectAny述語を引数として指定して、単独で使用することを期待しています。

第二に、lStoredRecordsレコードがある場合、これは常に返されますtrue-Any()述語なしでは、入力シーケンスにレコードがあるかどうかを返すだけでSelect、入力値を出力値に投影するだけです-フィルタリングはまったく実行されません. フィルタリングを期待していた場合は、 を使用する必要がありましたWhere

Any第三に、そもそもあなたが望んでいることは明らかではありません。あなたの質問から:

lStoredRecordsdtTime上記の条件を満たさないような1つのレコードが含まれているため、上記のコード行が返されることを期待していましたFalse

いずれかのレコードが条件を満たさない場合に返さfalseれるようにする場合は、ほぼ確実にAll代わりに使用する必要があります。すべての入力値が条件に一致するかどうかを確認する必要があります。

したがって、基本的には次のことが必要です。

return lStoredRecords.All(u => u.sCardId == sCardId && 
                               u.rtMode == eRecordType &&
                               u.dtTime >= DateTime.Now.AddMinutes(-15.0));
于 2012-08-26T08:22:47.337 に答える
2

現在のコードlStoredRecordsは のリストに投影されboolます。このリストには要素があるため (おそらくいくつかの要素trueといくつかの要素がありますfalseが、それは問題ではありません)、Any()true を返します。

代わりに使用してください:

return lStoredRecords.Any(u => 
                          u.sCardId == sCardId && 
                          u.rtMode == eRecordType &&
                          u.dtTime >= DateTime.Now.AddMinutes(-15.0));
于 2012-08-26T08:22:37.973 に答える
1

私はあなたがこれをやろうとしていると思います...

return lStoredRecords.Any(u => 
                             u.sCardId == sCardId && 
                             u.rtMode == eRecordType &&
                             u.dtTime >= DateTime.Now.AddMinutes(-15.0));

Select何をして何をするかを読んでAnyください(Whereここでも関連しています)。

記述したSelect式は に変換lStoredRecordsされ、IEnumerable<bool>これに要素があるかどうかを確認します。trueそれはあなたの表現で、またはfalseあなたの表現に従って満たされますSelect。実際Selectに行っていることを期待していると思います。Whereそれでも、より良い選択は式を に入れることAnyです。これにより、不要な操作を防ぐことができます。

于 2012-08-26T08:22:44.247 に答える