C# LINQ Select()/Any()行为不正常?
我有以下代码C# LINQ Select()/Any()行为不正常?,c#,linq,C#,Linq,我有以下代码 return lStoredRecords.Select(u => u.sCardId == sCardId && u.rtMode == eRecordType && u.dtTime >= DateTime.Now.AddMinutes
return lStoredRecords.Select(u =>
u.sCardId == sCardId &&
u.rtMode == eRecordType &&
u.dtTime >= DateTime.Now.AddMinutes(-15.0)).Any();
但出于某种原因,它总是会回到真实的状态
lStoredRecords包含一条记录,因此它的dtTime不满足上述条件-因此我希望上面的代码行返回False
有什么想法吗?您当前的代码项目将记录到布尔列表中。因为这个列表确实有一些元素,可能是真的,也可能是假的——这无关紧要,任何元素都会返回真的 改用:
return lStoredRecords.Any(u =>
u.sCardId == sCardId &&
u.rtMode == eRecordType &&
u.dtTime >= DateTime.Now.AddMinutes(-15.0));
当前代码将lStoredRecords投影到布尔列表。因为这个列表确实有一些元素,可能是真的,也可能是假的——这无关紧要,任何元素都会返回真的 改用:
return lStoredRecords.Any(u =>
u.sCardId == sCardId &&
u.rtMode == eRecordType &&
u.dtTime >= DateTime.Now.AddMinutes(-15.0));
我想你是想这么做
return lStoredRecords.Any(u =>
u.sCardId == sCardId &&
u.rtMode == eRecordType &&
u.dtTime >= DateTime.Now.AddMinutes(-15.0));
阅读与此处相关的Select和Any do
您编写的Select表达式将lStoredRecords转换为IEnumerable,然后检查是否有任何元素。根据您选择的表达式,它将填充true或false。我想你希望Select做的是Where实际做的事情。但更好的选择是将表达式放在任意位置。这将防止不必要的操作。我认为您正在尝试这样做
return lStoredRecords.Any(u =>
u.sCardId == sCardId &&
u.rtMode == eRecordType &&
u.dtTime >= DateTime.Now.AddMinutes(-15.0));
阅读与此处相关的Select和Any do
您编写的Select表达式将lStoredRecords转换为IEnumerable,然后检查是否有任何元素。根据您选择的表达式,它将填充true或false。我想你希望Select做的是Where实际做的事情。但更好的选择是将表达式放在任意位置。这将防止不必要的操作。首先,不清楚为什么要使用Select。我希望您只使用Any本身,将谓词指定为参数 其次,如果lStoredRecords有任何记录,它将始终返回true-没有谓词,它只返回输入序列中是否有任何记录,Select只是将输入值投影到ouptut值-它根本不进行任何筛选。如果您希望进行筛选,则应该使用 第三,不清楚你一开始是否想要。根据你的问题: lStoredRecords包含一条记录,因此它的dtTime不满足上述条件-因此我希望上面的代码行返回False 如果您希望它在任何记录未能满足某个条件时返回false,那么几乎可以肯定的是,您应该使用All来代替它—您希望检查所有输入值是否与您的条件匹配 所以基本上你想要:
return lStoredRecords.All(u => u.sCardId == sCardId &&
u.rtMode == eRecordType &&
u.dtTime >= DateTime.Now.AddMinutes(-15.0));
首先,不清楚为什么要使用Select。我希望您只使用Any本身,将谓词指定为参数 其次,如果lStoredRecords有任何记录,它将始终返回true-没有谓词,它只返回输入序列中是否有任何记录,Select只是将输入值投影到ouptut值-它根本不进行任何筛选。如果您希望进行筛选,则应该使用 第三,不清楚你一开始是否想要。根据你的问题: lStoredRecords包含一条记录,因此它的dtTime不满足上述条件-因此我希望上面的代码行返回False 如果您希望它在任何记录未能满足某个条件时返回false,那么几乎可以肯定的是,您应该使用All来代替它—您希望检查所有输入值是否与您的条件匹配 所以基本上你想要:
return lStoredRecords.All(u => u.sCardId == sCardId &&
u.rtMode == eRecordType &&
u.dtTime >= DateTime.Now.AddMinutes(-15.0));
您正在选择一个布尔值。您正在选择一个布尔值。