6

何がより高速で、速度を達成するためにLinq標準を犠牲にする必要がありますか(辞書ルックアップが本当に高速であると仮定)?だから私に詳しく説明させてください:

私は次のものを持っています:

List<Product> products = GetProductList();

シリアル番号などの属性に基づいて商品を検索する必要があります。最初に辞書を作成してから、次のように入力します。

Dictionary<string, Product> dict = new Dictionary<string, Product>();
foreach(Product p in products)
{
    dict.Add(p.serial, p);
}

製品を見つけるときは、辞書ルックアップによって提供されるO(1)を利用してください。

string some_serial = ...;
try { Product p = dict[some_serial]; } catch(KeyNotFoundException) { }

または、Linqを使用します。

Product p = products.Where(p => p.serial.Equals(some_serial)).FirstOrDefault();

Dictアプローチの欠点は、もちろん、これにはメモリ内のより多くのスペース、書き込むためのより多くのコード、あまりエレガントではないなどが必要になることです(ただし、これのほとんどは議論の余地があります)。それが要因ではないと仮定します。私は最初のアプローチを取るべきですか?

結論として、上記のLinqアプローチの複雑さが実際にO(n)であるかどうかを確認したいと思いますが、それよりも優れているかどうかはわかりません。

4

1 に答える 1

8

オブジェクトの列挙から始めて、これを1回だけ実行していると仮定します...

Whereaに追加してからDictionary<TKey,TValue>振り返るよりも、このメソッドを実行する方が高速です。その理由は、ディクショナリメソッドがO(1)ではないためです。このシナリオでは、辞書に項目を追加してから検索します。Where追加部分はO(N)であり、これは追加のメモリオーバーヘッドを伴う方法と 同じくらい高価です。

注意すべきもう1つのマイナーな点Dictionary<TKey,TValue>は、真にO(1)ではないということです。代わりにO(1)に近づきますが、特定の状況(たとえば、多くの衝突するキー)ではパフォーマンスが低下する可能性があります。

于 2010-03-16T16:35:04.823 に答える