嗨,我有以下代码会产生奇怪的行为。由 linq to Objects 生成的 IEnumerable 中包含的对象实例的属性不会在后续的 foreach 语句中更新。foreach 语句应枚举 IEnumerable。相反,解决方案是在之前枚举它。
虽然我找到了解决方案,但我在书籍或文章中的任何地方都没有看到这个解决方案,处理类似的例子。也许对 linq 有复杂了解的人可以解释一下。
我花了一天的时间来查明错误的确切原因,而且在大型应用程序中调试并不容易。然后我在一个更简单的环境中复制了它,如下所示。
public class MyClass
{
public int val ;
}
public class MyClassExtrax
{
public MyClass v1 { get; set; }
public int prop1 { get; set; }
}
void Main()
{
List <MyClass> list1 = new List<MyClass>();
MyClass obj1 = new MyClass(); obj1.val = 10;
list1.Add(obj1);
MyClass obj2 = new MyClass();
obj2.val = 10;
list1.Add(obj2);
IEnumerable<MyClassExtrax> query1 =
from v in list1
where v.val >= 0
select new MyClassExtrax{ v1=v , prop1=0 } ;
//query1=query1.ToList(); solves the problem..but why is this needed..?
foreach (MyClassExtrax fj in query1)
{
fj.v1.val = 40;
fj.prop1 = 40; //property does not get updated..
}
foreach (MyClass obj in list1)
{
Console.WriteLine("in list 1 value is {0} : ", obj.val);
}
foreach (MyClassExtrax obj in query1)
{
Console.WriteLine("in MyClassExtra list v1.val is {0}, prop1 is {1} ", obj.v1.val, obj.prop1);
}
}
输出:在列表 1 中,值为 40:
列表 1 中的值为 40 :
在 MyClassExtra 列表中 v1.val 为 40,prop1 为 0
在 MyClassExtra 列表中 v1.val 为 40,prop1 为 0
如您所见,prop1 没有更新到 40。!!