7

私はILookup<TKey,TElement> lookupかなり頻繁に要素を取得し、LINQ または を使用してそれらを反復処理するを持っていforeachます。私はこのように見上げますIEnumerable<TElement> results = lookup[key];

したがって、resultsルックアップ結果を使用するたびに少なくとも 1 回列挙する必要があります (最初に .ToList() を使用しない場合は、複数回反復する場合はさらに)。

「クリーン」ではありませんがDictionary<TKey,List<TElement>>、キーからのすべての結果が辞書の構築時にのみ列挙されるように、を使用する方が (パフォーマンス的に) 優れているのではないでしょうか? ToList() はどのくらい負担が大きいのでしょうか?

4

2 に答える 2

16

ToLookupは、他のすべてのToXXXLINQ メソッドと同様に、即時実行を使用します。結果のオブジェクトには、元のソースへの参照がありません。それは効果的構築しますDictionary<TKey, List<TElement>>- おそらくそれらの正確なタイプではありませんが、それと同等です。

ただし、役立つ場合とそうでない場合がある違いがあることに注意してください。ルックアップのインデクサーは、存在しないキーを指定すると、例外をスローするのではなく、空のシーケンスを返します。任意のキーでインデックスを作成し、対応する値を反復処理できるようにしたい場合は、これにより作業がはるかに簡単になります。

また、明示的に文書化されていませんが、値シーケンスに使用される実装は implement であるため、LINQ メソッドの呼び出しは O(1) であることに注意してくださいすべてICollection<T>Count()要素を反復処理する必要はありません。

詳細については、Edulinq の投稿をToLookup参照してください。

于 2012-09-12T13:29:11.403 に答える
4

実装が であると仮定するとSystem.Linq.Lookup(ILookup他の実装はありますか?)、 に示されてlookup[key]いる要素は のフィールドとして要素の配列に格納されますSystem.Linq.Lookup.Grouping。それらを繰り返し検索しても、ソースの繰り返しは発生しません。もちろん、再構築にLookupはコストがかかりますが、一度構築すると、ソースにはアクセスできなくなります。

于 2012-09-12T13:24:29.223 に答える