1

我有以下代码

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

但由于某种原因,它总是返回True

lStoredRecords包含一条不满足上述条件的记录dtTime -所以我期待上面的代码行返回False

有任何想法吗?

4

3 回答 3

7

首先,不清楚你为什么要使用Select。我希望您只使用Any它自己,将谓词指定为参数。

其次,如果lStoredRecords有任何记录,这将始终返回true-Any()没有谓词只返回输入序列中是否有任何记录,并且Select只是将输入值投影到输出值 - 它根本不做任何过滤. 如果您希望进行过滤,则应该使用Where.

第三,首先不清楚你想要什么Any。从你的问题:

lStoredRecords包含一条dtTime不满足上述条件的记录 - 所以我期待上面的代码行返回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

您当前的代码项目lStoredRecordsbools 列表。由于这个列表确实有元素(也许一些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));

阅读做什么SelectAny做什么(Where在这里也很重要)。

Select您编写的表达式将转换lStoredRecordsIEnumerable<bool>,然后检查它是否有任何元素。它将被填充truefalse根据你的Select表达。我认为你期望SelectWhere实际做的事情。但更好的选择是将表达式放入Any. 这将防止不必要的操作。

于 2012-08-26T08:22:44.247 回答