嗨,我有下面的代碼,它會產生一個奇怪的行爲。 Linq生成的IEnumerable中包含的對象實例的屬性在後續的foreach語句中不會更新。 foreach語句應該枚舉IEnumerable。相反,解決方案是先枚舉它。在延遲執行LINQ C#中的奇怪行爲
雖然我找到了解決方案,但我沒有看到這個文檔記載在書籍或文章的任何地方,處理類似的例子。也許有人對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
在MyClassExtralist v1.val是40,prop1是0
正如你所看到的,prop1不會更新到40。
謝謝你是對的。該屬性確實得到更新。例如當插入Console.WriteLine時(「在MyClassExtra列表中v1.val是{0},prop1是{1}」,fj.v1.val,fj.prop1);在第一個循環中。就在第二個循環中,它創建了一個MyClassExtrax實例的新參考。 – gregor