我有以下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/

10-13 05:57