2016-08-26 8 views
2

私は値としてオブジェクトのリストを持っているときに、対応するキーを見つけたいと思います。 は私が値がC#のオブジェクトのリストである場合、辞書のキーを見つける方法は?

foreach (var item in dict) 
{ 
    foreach (var subItem in item.Value) 
    { 
     if (subItem.Equals(foo)) 
     { 
       Console.WriteLine(item.Key); 
     } 
    } 
} 

、私は何かなどを行うことができます知っている。しかし、これは、私は巨大なデータセットを持っている多くの時間を要し辞書、

Dictionary<string, List<object>> dict = new Dictionary<string, List<object>>(); 

があるとします。これにはもっと速い解決策がありますか?

私はLINQを使用して、値が与えられたキーを見つけるの通常の方法のようなものであることを知っている:私は私の状況で同様のソリューションを探しています

var keysWithMatchingValues = dict.Where(p => p.Value == myObject).Select(p => p.Key); 

+11

LINQの使用では、ここで使用されている基本的なアルゴリズムは変更されていません。これが遅すぎる場合は、データ構造を調整して、必要なデータを見つけるために各項目を調べる必要がないようにする必要があります。 – Servy

+1

LINQはほとんどの場合パフォーマンスはそれほど優れていませんが、LINQを使って正確で読みやすいコードを書く方が簡単です。複製が可能でない場合は、リストの代わりに 'HashSet 'を使用します。どのような型か分かっているなら、私はオブジェクトの代わりにその型を使うでしょう。 –

+0

提案していただきありがとうございます! – agenthost

答えて

3

LINQはほとんどの場合パフォーマンスは向上しませんが、LINQで正しい読み取り可能なコードを書く方が簡単です。重複する値がない場合は、リストの代わりにHashSet<T>を使用します。どのような型か分かっているなら、私はオブジェクトの代わりにその型を使うでしょう。

だろうあなたのコードのLINQのバージョン.... List.Contains

  1. List<string> keysWithValue = dict 
        .Where(kv => kv.Value.Contains(foo)) 
        .Select(kv => kv.Key); 
        .ToList(); 
    
  2. またはEnumerable.Any

    List<string> keysWithValue = dict 
        .Where(kv => kv.Value.Any(v => foo.Equals(v))) 
        .Select(kv => kv.Key); 
        .ToList(); 
    

しかしmentioneとしてこれは効率的ではありません。パフォーマンスを向上させる1つの方法は、Lookup<TKey, TValue>を使用することです。辞書はあなたが一度だけ、それを作成する必要が変更されない場合:

var valueToKeyLookup = dict // make it an instance field, so that you don't have to create it always 
    .SelectMany(kv => kv.Value 
     .Distinct() 
     .Select(v => new {Key = kv.Key, Value = v}) 
    ) 
    .ToLookup(x => x.Value, x => x.Key); 

今、残りのコードは非常に簡潔かつ効率的です。何のリストがあること含まれていない場合、これはでも動作すること

List<string> allKeysWithFoo = valueToKeyLookup[foo].ToList(); 

注意を値の場合、結果は空のリストになります。

+1

それは速いですか? – Thomas

+1

@トーマス:はい、今はありますが、別のコレクションを犠牲にしてより多くのメモリが得られます –

+2

@トーマス:ルックアップを作成するコストは高価ですが、その中で物事を見ることは非常に高速です。あなたが不変の辞書で複数のものを検索する必要がある場合、これははるかに速くなるでしょう。 –

関連する問題