2010-12-15 66 views
0

Je veux construire un Dictonary comme celui-ci:C# tableau associatif avec le dictionnaire

Dictionary<String, ArrayList> myDic = new Dictionary<String, ArrayList>(); 

à la fin je veux une structure comme:

["blabla"] => array(1,2,3) 
["foo"] => array(1,4,6,8) 
....... 

pour construire ce que je cours dans une boucle et chaque boucle construire des cordes,

première question:

comment vérifier chaque fois si cette chaîne existe dans le dictionnaire, si elle existe pas ouvrir une nouvelle entrée dans le dictionnaire avec un élément dans la liste de tableau, si existe seulement ajouter un autre élément à la liste de tableau

et un autre question:

comment puis-je trier ce dictionnaire en fonction du nombre d'éléments dans la liste de tableau (en ordre décroissant) comme:

["foo"] => array(1,4,6,2,8)  
["bar"] => array(4,6,2,8) 
["bla"] => array(1,2,3) 
["blo"] => array(1,2)  
    ....... 

merci!

Répondre

2

Au lieu de ArrayList, vous devez utiliser un tableau ou List<T>. En supposant que vous avez un Dictionary<string, int> appelé la source cela devrait fonctionner:

var items = source 
    .GroupBy(kvp => kvp.Key) 
    .Select(grp => new { Key = grp.Key, Items = grp.Select(kvp => kvp.Value).ToArray() }) 
    .OrderByDescending(i => i.Items.Length); 

Expliquer, Dictionary<TKey, TValue> implémente IEnumerable<KeyValuePair<TKey, TValue>> peut donc être considéré comme une séquence de paires clé-valeur. Regroupez par groupes les paires par clé, puis Select crée une séquence d'un type anonyme qui contient la clé et les valeurs associées dans une propriété Clé et éléments respectivement. Cette séquence est ensuite triée par le nombre d'éléments dans le tableau Items de chaque objet.

Si vous souhaitez les commander selon la longueur du tableau créé, vous ne pouvez pas utiliser un dictionnaire car ils ne sont pas commandés.

+0

i newbie in C# si vous pouvez expliquer plus –

+0

Si vous avez une variable appelée 'source' qui est une liste/tableau/énumérable d'entiers, ce code vous rendra ce que vous avez demandé: une liste, dans l'ordre décroissant par longueur, de groupes, où chaque groupe a une clé ("foo", "bar", "bla", "blo", etc.) et la liste des éléments correspondants. –

1

Pour vérifier si une clé existe dans un dictionnaire et d'utiliser la valeur si elle le fait, vous pouvez utiliser TryGetValue:

ArrayList array; 
if(!myDic.TryGetValue("blabla", out array)) 
{ 
    array = new ArrayList(); 
    myDic["blabla"] = array; 
} 
array.Add(42); 
0

Would quelque chose comme ce travail:

 if (myDic.ContainsKey(myString)) 
      myDic[myString].Add(myNumber); 
     else 
      myDic.Add(myString, new ArrayList(new int[] {myNumber})); 
5

Utilisez l'outil droit Pour le boulot. La structure de données que vous voulez s'appelle un "multi-dictionnaire" - c'est un dictionnaire qui mappe d'une clé à une séquence de valeurs, plutôt que d'une clé à une valeur unique.

Le PowerCollections codebase contient une implémentation de MultiDictionary que probablement fait ce que vous voulez. Je l'utiliserais plutôt que d'écrire le vôtre.

Pour trier le dictionnaire en une séquence de paires clé/séquence ordonnée par la longueur de la séquence, j'utiliserais une requête LINQ avec une clause "order by". Cela semble être la façon la plus facile de le faire.