我有以下代码
return lStoredRecords.Select(u =>
u.sCardId == sCardId &&
u.rtMode == eRecordType &&
u.dtTime >= DateTime.Now.AddMinutes(-15.0)).Any();
但由于某种原因,它总是返回True
,
lStoredRecords
包含一条记录,使得dtTime
不满足上述条件 - 所以我期待上面一行代码返回False
有什么想法吗?
答案 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));
阅读Select
和Any
所做的事情(此处Where
也相关)。
您编写的Select
表达式会将lStoredRecords
转换为IEnumerable<bool>
,然后检查这是否包含任何元素。它将根据您的true
表达式填充false
或Select
。我认为你期望Select
做Where
实际做的事情。但更好的选择是将表达式放在Any
中。这样可以防止不必要的操作。