2011-03-30 35 views
0

嗨,我剛剛遇到同步問題,並已在這個小例子中複製它。這是ObservableCollection和Linq的正確行爲嗎?

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分兩次。 無論如何要避免這種行爲,仍然使用可觀察的集合?

我試圖實現重新排序的方法,但這使得很難選擇正確的項目。

UPDATE

五言的一個簡單的解決辦法是修改它這樣

int found = count.Count(); 
      Console.WriteLine("Found {0}", found); 

      list[2].Number = 1; 
      Console.WriteLine("Found {0}", found); 

回答

3

這是由於您的LINQ查詢的懶散評估和無關與ObservableCollection。如果將LINQ查詢更改爲以下行:

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

您將看到您期望的行爲。

ToList()此外還可以確保您的LINQ查詢在此刻被評估。否則,僅在必要時評估。因爲您撥打Count()兩次,查詢會被評估兩次,但會根據不同的數據進行評估。

+0

謝謝,它的工作原理就像我現在要的 – gulbaek 2011-03-30 14:11:52

2

您遇到了LINQ的一個缺陷。在你的例子中變量count不是結果的一個查詢,它的的查詢。每當您更改底層集合中的內容時,更改都會反映在隨後的調用中。

+0

不知道,謝謝你分享你的信息。 – gulbaek 2011-03-30 14:10:16