6

このコードは機能しますが、ignored辞書を二重に参照するため非効率的です。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;

問題は、out パラメーターに使用する LINQ ステートメント内で変数を宣言する方法がわからないことです。

4

3 に答える 3

3

outクエリの前に変数を宣言する必要があります。

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

ただし、クエリが後で評価されない場合の副作用に注意してください...

于 2010-07-19T12:06:00.687 に答える
1

外部変数を使用すると、LINQ 式はそれを維持するクロージャーであるため、スコープ外になることを心配する必要はありません。ただし、競合を避けるために、変数と式を関数に入れることができます。

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

...

var results = GetRecordQuery();

そうすれば、クエリだけがs変数にアクセスでき、他のすべてのクエリ ( への個別の呼び出しから返されるGetRecordQuery) はそれぞれ、変数の独自のインスタンスを持ちます。

于 2014-01-08T15:03:28.883 に答える