2010-07-19 25 views
2

此代碼的工作,但效率不高,因爲它的雙查找的ignored字典。如何在LINQ語句中使用字典TryGetValue()方法使其更高效?在LINQ中使用TryGetValue()?

IDictionary<int, DateTime> records = ... 

IDictionary<int, ISet<DateTime>> ignored = ... 

var result = from r in records 
      where !ignored.ContainsKey(r.Key) || 
      !ignored[r.Key].Contains(r.Value) 
      select r; 

問題是我不知道如何在LINQ語句中聲明一個變量用於out參數。

回答

1

您需要查詢前申報out變量:

ISet<DateTime> s = null; 
var result = from r in records 
      where !ignored.TryGetValue(r.Key, out s) 
       || !s.Contains(r.Value) 
      select r; 

小心的副作用,如果查詢不計算,直到後來,雖然...

+0

This works。我猜測,確保在變量仍在範圍內時對其進行評估,並且不要嘗試將其與並行LINQ結合使用。 – 2010-07-19 12:40:09

+0

@Joe,確切地說......會有不可預測的效果 – 2010-07-19 18:35:15

1

使用一個外部變量,你不必擔心它走出去的範圍,因爲LINQ表達式是關閉將保持它活着。然而,爲了避免任何衝突,你可以把變量和表達式中的函數:

public IEnumerable GetRecordQuery() { 
    ISet<DateTime> s = null; 
    return from r in records 
      ... 
} 

... 

var results = GetRecordQuery(); 

這樣,只有查詢訪問的s變量,以及任何其他查詢(從單獨調用返回GetRecordQuery)會每個都有自己的變量實例。