C #: преобразование словаряв словарь> - PullRequest
1 голос
/ 23 октября 2010

Первый Dictionary похож на

        Dictionary<String, String> ParentDict = new Dictionary<String, String>();
        ParentDict.Add("A_1", "1");
        ParentDict.Add("A_2", "2");
        ParentDict.Add("B_1", "3");
        ParentDict.Add("B_2", "4"); 
        ParentDict.Add("C_1", "5");

Мне нужно преобразовать это в новый Dictionary<String, Dictionary<String,String>>

Результат будет содержать

Key                    Value

              Key                   Value             
_________________________________________________

"A"             "A_1"                    "1"
                "A_2"                    "2"

"B"             "B_1"                    "1"
                "B_2"                    "2"

"C"             "C_1"                    "1"

ТеперьЯ использую nested for loop, чтобы сделать это.

Как я могу сделать это, используя LNQ или LAMBDA Expression?

Ответы [ 3 ]

5 голосов
/ 23 октября 2010
 var result = ParentDict.GroupBy(p => p.Key[0].ToString())
                        .ToDictionary(g => g.Key, g => g.ToDictionary(x => x.Key, x => x.Value));
1 голос
/ 23 октября 2010

Причина для этого, я подозреваю, заключается в том, что вам нужно иметь возможность искать все записи для определенной ключевой буквы.В этом случае Lookup является лучшим соответствием, как правило:

var letterLookup = ParentDict.ToLookup(kv=>kv.Key[0]);

Можно использовать так:

//letterLookup['A'] is an IEnumerable<KeyValuePair<string,string>>...

Console.WriteLine(string.Join(", ",
        letterLookup['A'].Select(kv=>kv.ToString()).ToArray()
    )); // [A_1, 1], [A_2, 2]

Console.WriteLine(new XElement("root",
        letterLookup['B'].Select(kv=>new XElement(kv.Key,kv.Value))
    ));// <root><B_1>3</B_1><B_2>4</B_2></root>


Console.WriteLine(letterLookup['B'].Any()); //true
Console.WriteLine(letterLookup['Z'].Any()); //false

Преимущество поиска по словарю состоит в том, что он может содержатьмножественные значения для любого заданного ключа (в отличие от словаря), и что у него есть непротиворечивый API, если определенный ключ отсутствует: тогда он возвращает пустое перечисляемое значение, тогда как словарь, содержащий перечисляемые значения, может либо генерировать KeyNotFoundException, либо возвращать ноль, либо возвращатьперечислимое пустое, все зависит от того, как вы его создали.

1 голос
/ 23 октября 2010

Попробуйте:

var result = from p in ParentDict
             group p by p.Key[0] into g
             select new { Key = g.Key, Value = g };

Это должно дать вам список {Key, Value}, где Key будет «A», «B», «C» и т. Д., А Value будет исходным экземпляром KeyValuePair из ParentDict.

Вы можете найти больше примеров запросов LINQ на этой странице MSDN: 101 Образцы Linq

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