Модификация словаря - PullRequest
       8

Модификация словаря

0 голосов
/ 03 ноября 2010

У меня есть Dictionary<string,string[]> Некоторые примеры значений:

Key1 Value="1","2","3","4","5"
Key2 Value="7","8"
Key3 Value=null

Я хочу, чтобы длина массива была максимальной из всех значений, которые в моем случае равны 5 для Key1, поэтому я могу получить результат как:

Key1 Value="1","2","3","4","5"
Key2 Value="7","8","","",""
Key3 Value="","","","",""

Таким образом, все ключи имеют одинаковую длину массива = 5, а значения, которых раньше не было, являются пустыми значениями "".Как это можно сделать?

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010

Попробуйте это

        Dictionary<string, List<string>> dic = new Dictionary<string, List<string>>();
        dic.Add("k1", new List<string>() { "1", "2", "3", "4", "5" });
        dic.Add("k2", new List<string>() { "7", "8" });
        dic.Add("k3", new List<string>());

        var max = dic.Max(x => x.Value.Count);
        dic.ToDictionary(
            kvp => kvp.Key,
            kvp =>
            {
                if (kvp.Value.Count < max)
                {
                    var cnt = kvp.Value.Count;
                    for (int i = 0; i < max - cnt; i++)
                        kvp.Value.Add("");
                }
                return kvp.Value;
            }).ToList();
2 голосов
/ 03 ноября 2010

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

Если вы хотите повысить эффективность, я бы удваивал массивы каждый раз, когда это происходит, чтобы избежать неэффективного кода.Вы можете отслеживать виртуальный «максимальный размер» всех массивов, даже если вы эффективно удваиваете их, отслеживая его в переменной класса int.

0 голосов
/ 08 ноября 2010
Dictionary<string, string[]> source = GetDictionary();

targetSize = source.Values.Select(x => x.Length).Max();

Dictionary<string, string[]> result = source.ToDictionary(
  kvp => kvp.Key,
  kvp => kvp.Value != null ?
    kvp.Value.Concat(Enumerable.Repeat("", targetSize - kvp.Value.Length)).ToArray() :
    Enumerable.Repeat("", targetSize).ToArray
);
...