7

質問する前に十分な調査を行っていないと思われる場合は、ご容赦ください。

問題 ディクショナリ内の値が一意であることを確認する必要があるというビジネス要件に出くわしました。つまり、辞書をフィルタリングする必要があり、そのようなフィルタリングの結果には、一意の値を持つキーと値のペアが含まれている必要があります。

ところで、これは文字列値と文字列キーを持つ単純な辞書です。さらに明確にするために、サンプルの入力値と期待される出力値
を以下に示します。 ", "Item One"}, {"Item2", "Item Two"}, {"Item22", "Item Two"} } この入力に対して、filteredDictionary は次のようになります - { {"Item1", "Item One" }, {"アイテム2", "アイテム2"} }

私が提案した解決策は機能しています

    var sourceDictionary = serviceAgent.GetSampleDictionary(); // Simplified for brevity  
    var filteredDictionary =  
        sourceDictionary.GroupBy(s => s.Value)  
            .Where(group => @group.Any())  
            .Select(g => g.First())  
            .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);  

質問 ロジックを作りすぎていませんか? または、言い換えれば、これを行う簡単な方法はありますか?

4

4 に答える 4

7

この行:

.Where(group => @group.Any()) 

とにかく空のグループを取得しないため、不要です。(「@」の意味も不明です。)

それ以外に、これを行うためのより簡単な方法はありません。

于 2013-01-03T12:19:35.733 に答える
3

あなたの方法は機能しますが、非常に読みやすいものではありません。この方法でクラスを作成する場合:

class DictionaryValueComparer<T1, T2> : IEqualityComparer<KeyValuePair<T1, T2>>
{
    public bool Equals(KeyValuePair<T1, T2> x, KeyValuePair<T1, T2> y)
    {
        return x.Value.Equals(y.Value);
    }

    public int GetHashCode(KeyValuePair<T1, T2> obj)
    {
        return obj.Value.GetHashCode();
    }
}

次に、メソッドを次のように減らすことができます。

dictionary = dictionary.Distinct(new DictionaryValueComparer<int, string>()).
    ToDictionary(p => p.Key, p => p.Value);
于 2013-01-03T12:23:59.433 に答える
0

Linq 拡張メソッド .Distinct() を使用しないのはなぜですか?

于 2013-01-03T12:19:14.190 に答える
0

カスタムタイプではないことを前提としています(実装IEqualityComparer<YourType>してに渡す必要がありますDistinct

var distinctDict = sourceDictionary
    .ToDictionary(kv => kv.Key, kv => kv.Value.Distinct());

デモ

var sourceDictionary=new Dictionary<string, List<string>>();
sourceDictionary.Add("A", new List<string>() { "A", "A", "B"});
sourceDictionary.Add("B", new List<string>() { "C", "D", "D" });

var distinctDict = sourceDictionary.ToDictionary(kv => kv.Key, kv => kv.Value.Distinct());
foreach(var kv in distinctDict)
    Console.WriteLine("Key:{0} Values:{1}", kv.Key, string.Join(",", kv.Value));
    // "A", "B" and "C", "D"
于 2013-01-03T12:20:04.857 に答える