您好我刚遇到同步问题,并在这个小例子中复制了它。
class MyClass
{
public int Number { get; set; }
}
static void Main(string[] args)
{
var list = new ObservableCollection<MyClass>
{
new MyClass() {Number = 1},
new MyClass() {Number = 2},
new MyClass() {Number = 3}
};
var count = from i in list where i.Number == 1 select i;
Console.WriteLine("Found {0}", count.Count());
list[2].Number = 1;
Console.WriteLine("Found {0}", count.Count());
}
这将输出
Found 1
Found 2
这不是我的预期,会猜到它会两次都返回1。 无论如何,它仍然避免这种行为,仍然使用可观察的集合?
我正在尝试实施一种方法来重新排序,但这使得很难选择正确的项目。
一个简单的解决方案就是像这样修改它
int found = count.Count();
Console.WriteLine("Found {0}", found);
list[2].Number = 1;
Console.WriteLine("Found {0}", found);
答案 0 :(得分:3)
这是由于您对LINQ查询的延迟评估,与ObservableCollection
无关。如果将LINQ查询更改为以下行:
(from i in list where i.Number == 1 select i).ToList();
你会看到你期望的行为。
ToList()
添加确保在那时评估您的LINQ查询。否则,仅在必要时进行评估。因为您两次调用Count()
,所以查询会被评估两次,但会使用不同的数据。
答案 1 :(得分:2)
您遇到了LINQ的一个陷阱。示例中的变量count
不是查询的结果, 是查询。每次更改基础集合中的内容时,更改都将反映在后续调用中。