2015-02-03 6 views
1

У меня есть словарь, как это:Group словарь путем разделения ключа и создать новый словарь

Dictionary<string, object> properties = new Dictionary<string, object>() 
{ 
    {"aa:bb", MyObject1}, 
    {"aa:cc", MyObject2}, 
    {"dd:xx", MyObject3}, 
    {"dd:yy", MyObject4} 
}; 

Ключ словаря является строка с ':' в качестве разделителя. Теперь я хочу сделать создать из этого словаря новый:

Dictionary<string, object> ddProperties = new Dictionary<string, object>() 
{ 
{"xx", MyObject3}, 
{"yy", MyObject4} 
}; 

Я ищу элегантный способ для создания нового словаря путем разделения ключа исходного словаря. Возможно ли это с LINQ?

ответ

3

Try:

var ddProperties = properties.ToDictionary 
        (kvp => kvp.Key.Split(':')[1], kvp => kvp.Value); 

Если вам нужны только те, которые начинаются с dd (как можно видеть в вашем примере вывода), я хотел бы сделать:

var filteredPairs = from kvp in properties 
        let split = kvp.Key.Split(':') 
        where split[0] == "dd" 
        select new { Key = split[1], kvp.Value }; 

var ddProperties = filteredPairs.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 

не Обратите внимание, что не существует защита от дубликатов здесь. Если вы ожидаете дублировать ключи после преобразования, как бы вы хотели справиться с ними?

+2

Похоже, он хочет только подмножество элементов, те, где первая половина ключа является конкретный идентификатор ('«дд» 'в своем примере) , поэтому вам понадобится предложение Where. –

+1

@ObliviousSage: Хорошо, я добавил для этого код. – Ani

1

Обратите внимание, что поскольку каждая запись имеет несколько результатов, используйте .SelectMany().

Как уже упоминалось, ToDictionary строит словари красиво

properties 
    .SelectMany(kvp => kvp.Key.Split(':') 
     // Select each item in the split 
     // to gain access to the original Key Value Pair parameter 
     .Select(key => new { Key = key, Value = kvp.Value })) 
    .ToDictionary(
     a => a.Key, 
     a => a.Value); 
Смежные вопросы