LINQ Select()/ Any()行为不端?

时间:2012-08-26 08:20:20

标签: c# linq

我有以下代码

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

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

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

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

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

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

第三,目前尚不清楚你是否想要Any。从你的问题:

  

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

如果您希望它返回false,如果任何记录无法满足条件,您几乎肯定会使用All - 您想检查是否所有输入值符合您的条件。

所以基本上你想要:

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

答案 1 :(得分:2)

您当前的代码将lStoredRecords投影到bool的列表中。由于此列表确实包含元素(可能有一些true和一些false - 这无关紧要),Any()将返回true。

改为使用:

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

答案 2 :(得分:1)

我想你正试图这样做......

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

阅读SelectAny所做的事情(此处Where也相关)。

您编写的Select表达式会将lStoredRecords转换为IEnumerable<bool>,然后检查这是否包含任何元素。它将根据您的true表达式填充falseSelect。我认为你期望SelectWhere实际做的事情。但更好的选择是将表达式放在Any中。这样可以防止不必要的操作。