Есть ли способ разбить универсальный словарь C # на несколько словарей? - PullRequest
4 голосов
/ 01 февраля 2010

У меня есть словарь C # Dictionary<MyKey, MyValue>, и я хочу разделить его на набор Dictionary<MyKey, MyValue>, основанный на MyKey.KeyType. KeyType - это перечисление.

Тогда у меня останется словарь, содержащий пары ключ-значение, где MyKey.KeyType = 1, и другой словарь, где MyKey.KeyType = 2, и так далее.

Есть ли хороший способ сделать это, например, использовать Linq?

Ответы [ 6 ]

9 голосов
/ 01 февраля 2010
var dictionaryList = 
    myDic.GroupBy(pair => pair.Key.KeyType)
         .OrderBy(gr => gr.Key)  // sorts the resulting list by "KeyType"
         .Select(gr => gr.ToDictionary(item => item.Key, item => item.Value))
         .ToList(); // Get a list of dictionaries out of that

Если вам нужен словарь словарей с ключом «KeyType» в конце, подход аналогичен:

var dictionaryOfDictionaries = 
    myDic.GroupBy(pair => pair.Key.KeyType)
         .ToDictionary(gr => gr.Key,         // key of the outer dictionary
             gr => gr.ToDictionary(item => item.Key,  // key of inner dictionary
                                   item => item.Value)); // value
1 голос
/ 01 февраля 2010

Я полагаю, что следующее будет работать?

dictionary
    .GroupBy(pair => pair.Key.KeyType)
    .Select(group => group.ToDictionary(pair => pair.Key, pair => pair.Value);
0 голосов
/ 14 сентября 2012
Dictionary <int,string> sports;
sports=new Dictionary<int,string>();
sports.add(0,"Cricket");
sports.add(1,"Hockey");
sports.add(2,"Badminton");
sports.add(3,"Tennis");
sports.add(4,"Chess");
sports.add(5,"Football");
foreach(var spr in sports)
console.WriteLine("Keu {0} and value {1}",spr.key,spr.value);

выход:

Key 0 and value Cricket
Key 1 and value Hockey
Key 2 and value Badminton
Key 3 and value Tennis
Key 4 and value Chess
Key 5 and value Football
0 голосов
/ 01 февраля 2010

Если только вы не хотите иметь отдельные коллекции:

Dictionary myKeyTypeColl<KeyType, Dictionary<MyKey, KeyVal>>
0 голосов
/ 01 февраля 2010

Вы можете просто использовать функцию GroupBy Linq:

            var dict = new Dictionary<Key, string>
                   {
                       { new Key { KeyType = KeyTypes.KeyTypeA }, "keytype A" },
                       { new Key { KeyType = KeyTypes.KeyTypeB }, "keytype B" },
                       { new Key { KeyType = KeyTypes.KeyTypeC }, "keytype C" }
                   };

        var groupedDict = dict.GroupBy(kvp => kvp.Key.KeyType);

        foreach(var item in groupedDict)
        {
            Console.WriteLine("Grouping for: {0}", item.Key);
            foreach(var d in item)
                Console.WriteLine(d.Value);
        }
0 голосов
/ 01 февраля 2010

Итак, вы на самом деле хотите переменную типа IDictionary<MyKey, IList<MyValue>>?

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