C #: Как сравнить значения словаря? - PullRequest
2 голосов
/ 03 января 2011

У меня есть Dictionary<String,String> следующим образом

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

и содержит

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

Мне нужно сравнить словарь Values, а затем добавить key с одинаковыми значениями

вот мой результирующий словарь

 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. Существует список дублирующихся значений (для ключей D, E и F.)

  2. Список значений содержит ключ.

Ожидаемый выход подобен

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

Т.е. key C не требуется, потому что значение C нигде не повторяется.

и нет необходимости включать keys D , E and F, поскольку он уже включен в списки значений A и B.

Как это сделать, используя Linq или Lambda Expression?

Ответы [ 2 ]

4 голосов
/ 03 января 2011
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 голосов
/ 03 января 2011

Это должно сделать это:

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 - он собирает вместе элементы перечисления на основе вашего сравнения.Как только вы это сделаете, это простой случай удаления синглетонов и преобразования оставшихся элементов в новый словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...