2010-11-03 14 views
0

J'ai un Dictionary<string,string[]> Quelques exemples de valeurs sontModification d'un dictionnaire

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

Je veux la longueur du tableau pour être au maximum de toutes les valeurs qui dans mon cas est de 5 pour Touche1 pour que je puisse obtenir un résultat as:

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

Donc toutes les clés ont la même longueur de tableau = 5 et les valeurs qui n'existaient pas auparavant sont des valeurs vides "". Comment cela peut-il être fait?

Répondre

2

Essayez cette

 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

Je encapsulerais un dictionnaire dans ma propre classe avec des méthodes similaires, sauf si une valeur est ajoutée, si vous devez étendre ce tableau pour contenir la valeur, vous étendez la taille de toutes les autres valeurs de tableau dans le dictionnaire.

Si vous voulez de l'efficacité, je doublerais les baies chaque fois que cela se produirait pour éviter l'inefficacité du code. Vous pouvez garder une trace de la 'taille max' virtuelle de tous les tableaux même si vous les doublez effectivement en gardant la trace dans une variable de classe int.

0
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 
);