我有以下foreach
表达式,在其中构建谓词,然后通过执行.Where()
过滤集合。
但是让我感到困扰的是,即使在下一次迭代中执行result.Count()
之前,0
也会给我.Where()
。
var result = SourceCollection;
foreach (var fieldName in FilterKeys)
{
if (!conditions.ContainsKey(fieldName)) continue;
if (!conditions[fieldName].IsNotNullOrEmpty()) continue;
var param = conditions[fieldName];
Func<BaseEntity, bool> predicate = (d) => fieldName != null && d.GetFieldValue(fieldName).ContainsIgnoreCase(param);
result = result.Where(predicate);
}
有人知道我可能忽略了导致此问题的任何LINQ行为吗?
最佳答案
我认为,您需要这样做:
var result = SourceCollection;
foreach (var fieldName in FilterKeys)
{
if (!conditions.ContainsKey(fieldName)) continue;
if (!conditions[fieldName].IsNotNullOrEmpty()) continue;
var param = conditions[fieldName];
var f = fieldName
Func<BaseEntity, bool> predicate = (d) => f != null && d.GetFieldValue(f).ContainsIgnoreCase(param);
result = result.Where(predicate);
}
注意谓词中使用
f
。您不想捕获foreach变量。在原始代码中,当第二次迭代开始时,param仍然是第一次迭代中捕获的值,但是fieldName已更改。关于c# - Linq Collection在foreach的下一次迭代时重置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7171359/