回答:
2つの大きな違い:
Lookup
不変です。Yay :)(少なくとも、具象Lookup
クラスは不変であり、ILookup
インターフェースは変更メンバーを提供しないと思います。もちろん、他の変更可能な実装もあるでしょう。)KeyNotFoundException
ます。(したがってTryGetValue
、AFAICRはありません。)それらは効率的に同等である可能性があります- Dictionary<TKey, GroupingImplementation<TValue>>
たとえば、ルックアップは舞台裏でよく使用するかもしれません。要件に基づいてそれらから選択してください。個人的には、ルックアップは通常、aよりも適していることがわかります。これはDictionary<TKey, List<TValue>>
、主に上記の最初の2つの点が原因です。
実装の詳細として、その具体的な実装がIGrouping<,>
値implementsに使用されることに注意してください。これは、などでIList<TValue>
使用すると効率的であることを意味します。Count()
ElementAt()
興味深いのは、実際の最大の違いについて誰も述べていないことです(MSDNから直接取得)。
ルックアップは辞書に似ています。違いは、Dictionaryはキーを単一の値にマップするのに対し、Lookupはキーを値のコレクションにマップするということです。
両方Dictionary<Key, List<Value>>
とLookup<Key, Value>
論理的に同様の方法で編成されたデータを保持し、両方の効率と同程度であることができます。主な違いはLookup
は不変です:Add()
メソッドもパブリックコンストラクターもありません(Jonが述べたように、例外なしで存在しないキーをクエリして、グループ化の一部としてキーを持つことができます)。
どちらを使用するかは、実際の使用方法によって異なります。常に変更されている複数の値へのキーのマップを維持している場合Dictionary<Key, List<Value>>
は、変更可能であるため、おそらくaの方が適しています。
ただし、データのシーケンスがあり、キーで編成されたデータの読み取り専用ビューのみが必要な場合、ルックアップは非常に簡単に作成でき、読み取り専用のスナップショットが得られます。
an ILookup<K,V>
とa の主な違いDictionary<K, List<V>>
は、辞書が変更可能であることです。キーを追加または削除したり、検索されたリストにアイテムを追加または削除したりできます。AnがILookup
ある不変と作成した後に変更することはできません。
両方のメカニズムの基礎となる実装は同じまたは類似しているため、検索速度とメモリフットプリントはほぼ同じになります。
まだ言及されていないもう1つの違いは、Lookup()がnullキーをサポートすることです。
LookupクラスはILookupインターフェイスを実装します。ルックアップは、複数の値を同じキーにマップできること、およびnullキーがサポートされていることを除いて、ディクショナリと非常に似ています。
と同じくらい効率的な構造を取得しようとしているDictionary
が、入力に重複するキーがないかどうかがわからない場合は、Lookup
より安全です。
別の回答で述べたように、これはnullキーもサポートし、任意のデータでクエリされたときに常に有効な結果を返すため、不明な入力に対する回復力が高いように見えます(Dictionaryより例外が発生しにくい)。
そして、それをSystem.Linq.Enumerable.ToDictionary
関数と比較すると特に当てはまります:
// won't throw
new[] { 1, 1 }.ToLookup(x => x);
// System.ArgumentException: An item with the same key has already been added.
new[] { 1, 1 }.ToDictionary(x => x);
別の方法は、foreach
ループ内に独自の重複するキー管理コードを記述することです。
リストが必要なく、膨大な数のアイテムDictionary
(または独自のカスタム構造)を管理する場合は、より効率的です。
Stopwatch stopwatch = new Stopwatch();
var list = new List<string>();
for (int i = 0; i < 5000000; ++i)
{
list.Add(i.ToString());
}
stopwatch.Start();
var lookup = list.ToLookup(x => x);
stopwatch.Stop();
Console.WriteLine("Creation: " + stopwatch.Elapsed);
// ... Same but for ToDictionary
var lookup = list.ToDictionary(x => x);
// ...
Lookup
各キーの項目のリストを維持しなければならない、それは(遅くアイテムの膨大な数の3倍程度)辞書より遅いです
ルックアップ速度:作成:00:00:01.5760444
辞書の速度:作成:00:00:00.4418833