2012-08-26 34 views
1

我有以下代码LINQ Select()/ Any()行为异常?

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仅仅是将项目的输入值的价值 - 它没有做任何过滤。如果您希望过滤,则应该使用Where

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

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

如果你希望它返回false如果有任何记录未能满足条件,那么您几乎可以肯定会使用All而不是 - 您要检查是否所有输入值都符合您的条件。

所以基本上你想要的:

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

您当前的代码将lStoredRecords设置为bool s的列表。由于此列表确实包含元素(可能有些true和一些false - 这并不重要),因此Any()返回true。

使用,而不是:

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

我想你想做到这一点...

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

阅读上什么SelectAny做(Where也与此有关)。

您所写的Select表达式会将lStoredRecords转换为IEnumerable<bool>,然后检查它是否有任何元素。根据您的Select表达式,它将填入truefalse。我认为你期望Select正在做什么Where实际上做。但更好的选择是将表达式放在Any中。这将防止不必要的操作。