2015-07-29 4 views
0

У меня есть словарь, как это:LINQ - Как сгруппировать с помощью словаря <string, string []>?

Dictionary<string, string[]> dic = new Dictionary<string,string[]>(){ 
      {"A", new string [] {"1", "2", "$", "3", "4"}}, 
      {"B", new string [] {"5", "6", "$", "7", "8"}}, 
      {"C", new string [] {"9", "10", "@", "11", "12"}} 
     }; 

, и я хотел бы, чтобы превратить его в новый словарь, как это:

Dictionary<string, List<string[]>> res = new Dictionary<string,List<string[]>>{ 
      {"$", new List<string[]> { 
       new string [] {"1", "2", "A", "3", "4"}, 
       new string [] {"5", "6", "B", "7", "8"} 
       } 
      },    
      {"@", new List<string[]> { 
       new string [] {"9", "10", "C", "11", "12"} 
       } 
      } 
     }; 

поэтому новый ключ становится 3-й элемент из старый строковый массив, а старый ключ добавляется в новый массив строк.

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

Я начал пытаться использовать некоторую LINQ для этого, но не могу обернуть мою голову вокруг всего этого - это:

Dictionary<string, string[]> test = dic.GroupBy(x => x.Value[2]) 
.ToDictionary(s => s.Key, s => s.Select(x => x.Key).ToArray()); 

работает только для создания другой строки шпоночного массива оцененного словаря, где ключ правильно становятся 3-м элементом, но значения - это только старые ключи.

ответ

2

Одно из возможных решений:

Dictionary<string, string[]> dic = new Dictionary<string,string[]>(){ 
      {"A", new string [] {"1", "2", "$", "3", "4"}}, 
      {"B", new string [] {"5", "6", "$", "7", "8"}}, 
      {"C", new string [] {"9", "10", "@", "11", "12"}} 
     }; 

var res = dic.Select(p => new KeyValuePair<string, string[]>(
           p.Value[2], 
           p.Value.Select((v,i) => i == 2 ? p.Key : v).ToArray())) 
      .GroupBy(p => p.Key) 
      .ToDictionary(g => g.Key, g => g.Select(p => p.Value).ToList()); 
2
var replacedIndex = 2; 

var newDictionary = 
    oldDictionary.GroupBy(x => x.Value.ElementAt(replacedIndex)) 
       .ToDictionary(group => group.Key, group => group.Select(x => 
       { 
        var collection = x.Value; 
        collection[replacedIndex] = x.Key; 
        return collection; 
       })); 
+0

Это не работает, потому что 'group.Key' является $ или @, а не оригинальные ключи A, B и C. – juharr

+0

@juharr ах, Ты прав. См. Обновленный ответ. –