这是ObservableCollection和Linq的正确行为吗?

时间:2011-03-30 13:58:54

标签: c# c#-4.0 observablecollection

您好我刚遇到同步问题,并在这个小例子中复制了它。

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);

2 个答案:

答案 0 :(得分:3)

这是由于您对LINQ查询的延迟评估,与ObservableCollection无关。如果将LINQ查询更改为以下行:

(from i in list where i.Number == 1 select i).ToList();

你会看到你期望的行为。

ToList()添加确保在那时评估您的LINQ查询。否则,仅在必要时进行评估。因为您两次调用Count(),所以查询会被评估两次,但会使用不同的数据。

答案 1 :(得分:2)

您遇到了LINQ的一个陷阱。示例中的变量count不是查询的结果 是查询。每次更改基础集合中的内容时,更改都将反映在后续调用中。