2011-01-03 14 views
1

C#:辞書の値を比較するには?

Dictionary<String, String> MyDict = new Dictionary<String, String>(); 

と私は辞書Valuesを比較すると、すべて同じ値に

を持つkey Sを追加する必要が

MyDict.Add("A", "1010"); 
MyDict.Add("B", "1011"); 
MyDict.Add("C", "1110"); 
MyDict.Add("D", "1010"); 
MyDict.Add("E", "1011"); 
MyDict.Add("F", "1010"); 

が含まれていますが、次のように私はDictionary<String,String>をここにされてい私の結果の辞書

Dictionary<String, List<String>> MyResultDict = new Dictionary<String, List<String>>(); 

そして、私のコード

var XXX = MyDict.ToLookup(X => X.Value, X => X.Key); 
MyResultDict = MyDict.ToDictionary(X => X.Key, X => XXX[X.Value].ToList()); 

{ "A"  { "A" , "D", "F" } } 
{ "B"  { "B" , "E" } } 
{ "C"  { "C" } } 
{ "D"  { "A" , "D", "F" } } 
{ "E"  { "B" , "E" } } 
{ "F"  { "A" , "D", "F" } } 

しかし、私の解決策は

  1. 2つの問題が発生しているため(重複値のリストが存在するように上記のコードは、結果を生成しますキーD,EF

  2. 値リストにはキーが含まれています。

予想される出力はCの値がどこにも繰り返されていないためkey Cの必要はありません

{ "A"  { "D", "F" } } 
{ "B"  { "E" } } 

すなわちのようなものです。

ABの値リストに既に含まれているので、keys D , E and Fを含める必要はありません。

これを行う方法LinqまたはLambda Expression

+2

値を '{" 1010 "{" A "、" D "、F"}} 'などの値でキーするほうがよいでしょうか? –

+1

予想される出力は、キーの順序に依存しているようです。 AとBは他よりも「重要」です。それは問題です。ディクショナリは順序付きコレクションではありません。 –

答えて

4
Dictionary<string, List<string>> result = myDict 
    .GroupBy(kvp => kvp.Value) 
    .Select(grp => new { Key = grp.First().Key, Matches = grp.Skip(1).Select(k => k.Key).ToList() }) 
    .Where(m => m.Matches.Count > 0) 
    .ToDictionary(m => m.Key, m => m.Matches); 

または多分ビット単純:

Dictionary<string, List<string>> result = myDict 
    .GroupBy(kvp => kvp.Value) 
    .Where(grp => grp.Count() > 1) 
    .ToDictionary(grp => grp.First().Key, grp => grp.Skip(1).Select(k => k.Key).ToList()); 
3

これはそれを行う必要があります。

var MyResultDict = 
    MyDict 
    .GroupBy(e => e.Value) 
    .Where(g => g.Count() > 1) 
    .ToDictionary(
     g => g.First().Key, 
     g => g.Select(e => e.Key).Skip(1).ToList()); 

ここで重要なのは、(あなたがしゃれを許します場合)GROUPBY方法である - それはあなたの比較に基づいて列挙の要素を集めます。これをやったら、シングルトンを削除し、残りの要素を新しい辞書に変換するのは簡単なケースです。

関連する問題