C# Linq集合在foreach的下一次迭代中重置

C# Linq集合在foreach的下一次迭代中重置,c#,.net,linq,c#-4.0,C#,.net,Linq,C# 4.0,我有下面的foreach表达式,我在其中构建谓词,然后通过执行.Where()来过滤集合 但让我困惑的是,result.Count()甚至在我在下一次迭代中执行.Where()之前就给了我0 var result = SourceCollection; foreach (var fieldName in FilterKeys) { if (!conditions.ContainsKey(fieldName)) continue; if (!conditions[fieldNam

我有下面的
foreach
表达式,我在其中构建谓词,然后通过执行
.Where()
来过滤集合

但让我困惑的是,
result.Count()
甚至在我在下一次迭代中执行
.Where()
之前就给了我
0

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);
}
var result=SourceCollection;
foreach(FilterKeys中的变量字段名)
{
如果(!conditions.ContainsKey(fieldName))继续;
如果(!conditions[fieldName].IsNotNullOrEmpty()继续;
var param=条件[fieldName];
Func谓词=(d)=>fieldName!=null&&d.GetFieldValue(fieldName).containsSignoreCase(param);
result=result.Where(谓词);
}

有人知道我可能忽略的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);
}
var result=SourceCollection;
foreach(FilterKeys中的变量字段名)
{
如果(!conditions.ContainsKey(fieldName))继续;
如果(!conditions[fieldName].IsNotNullOrEmpty()继续;
var param=条件[fieldName];
var f=字段名
Func谓词=(d)=>f!=null&&d.GetFieldValue(f).containsSignoreCase(param);
result=result.Where(谓词);
}

注意在谓词中使用了
f
。您不想捕获foreach变量。在您的原始代码中,当第二次迭代开始时,param仍然是第一次迭代捕获的值,但fieldName已更改。

我同意问题来自未捕获
foreach
变量,但还有一个更深层次的问题,那就是LINQ与命令式控制流结构的结合,即首先混合LINQ&
foreach

请尝试以下方法:

var predicates =
    from fieldName in FilterKeys
    where conditions.ContainsKey(fieldName)
    let param = conditions[fieldName]
    where param.IsNotNullOrEmpty()
    select (Func<BaseEntity, bool>)
        (d => fieldName != null
              && d.GetFieldValue(fieldName).ContainsIgnoreCase(param));

var result = predicates.Aggregate(
    SourceCollection as IEnumerable<BaseEntity>,
    (xs, p) => xs.Where(p));
var谓词=
来自FilterKeys中的fieldName
where conditions.ContainsKey(字段名)
设参数=条件[字段名]
其中param.IsNotNullOrEmpty()
选择(Func)
(d=>fieldName!=null
&&d.GetFieldValue(fieldName).ContainsIgnoreCase(param));
var result=predicates.Aggregate(
SourceCollection作为IEnumerable,
(xs,p)=>xs,其中(p));

不需要
foreach
循环,代码完全保留在LINQ中。朋友不应该让朋友将命令式和功能性混合在一起…:-)

嗯。。访问修改后关闭?我现在觉得很傻。。谢谢你……)现在很好用。