web-dev-qa-db-fra.com

ajouter des éléments à une liste dans un dictionnaire

J'essaie de mettre des valeurs dans un dictionnaire en fonction de la clé ... Par exemple, si dans une liste de clés à l'index 0, il y a une lettre "a". Je veux ajouter le val d'index 0 à une liste à l'intérieur d'un dictionnaire avec la clé "a" (dictionnaire (la clé est "a" à l'index 0, val à l'index 0) ... dictionnaire (la clé est "b" à indice 2, val à l'indice 2)) 

J'attends une sortie comme celle-ci:

dans listview lv1: 1,2,4 dans listview lv2: 3,5

ce que je reçois est 3,4,5 dans les deux listes

List<string> key = new List<string>();
List<long> val = new List<long>();
List<long> tempList = new List<long>();
Dictionary<string, List<long>> testList = new Dictionary<string, List<long>>();

key.Add("a");
key.Add("a");
key.Add("b");
key.Add("a");
key.Add("b");
val.Add(1);
val.Add(2);
val.Add(3);
val.Add(4);
val.Add(5);    

for (int index = 0; index < 5; index++)
{

    if (testList.ContainsKey(key[index]))
    {
        testList[key[index]].Add(val[index]);
    }
    else
    {
        tempList.Clear();
        tempList.Add(val[index]);
        testList.Add(key[index], tempList);
    }
}    
lv1.ItemsSource = testList["a"];
lv2.ItemsSource = testList["b"];

Solution:

remplacez la section de code else par:

testList.Add (clé [index], nouvelle liste {val [index]});

merci à tous pour votre aide =)

10
user2093348

Vous utilisez la même liste pour les deux clés dans le dictionnaire 

    for (int index = 0; index < 5; index++)
    {
        if (testList.ContainsKey(key[index]))
        {
            testList[k].Add(val[index]);
        }
        else
        {
            testList.Add(key[index], new List<long>{val[index]});
        }
    }

Il suffit de créer une nouvelle liste (Of Long) lorsque la clé n'existe pas, puis de lui ajouter la valeur longue

14
Steve

Supprimez la tempList et remplacez votre clause else par:

testList.Add(key[index], new List<long> { val[index] });

Et n'utilisez pas Contains. TryGetValue est bien meilleur:

for (int index = 0; index < 5; index++)
{
    int k = key[index];
    int v = val[index];
    List<long> items;
    if (testList.TryGetValue(k, out items))
    {
        items.Add(v);
    }
    else
    {
        testList.Add(k, new List<long> { v });
    }
}
1
Jim Mischel

Cela ressemble à un problème de devoirs, mais 

for (int index = 0; index < 5; index++)
{
    if (!testList.ContainsKey(key[index]))
        testList.Add(key[index], new List<string> {value[index]});
    else
        testList[key[index]].Add(value[index]);
}

Lire this (et les autres tutoriels pertinents)

1
Greg B

Remplacez le reste par:

else
{
    tempList.Clear();
    tempList.Add(val[index]);
    testList.Add(key[index], new List<long>(tempList));
}

Le problème est que vous ajoutez une référence à TempList aux deux clés, il s’agit de la même référence, elle est donc remplacée dans la première.

Je crée une nouvelle liste pour qu'elle ne soit pas remplacée: new List<long>(tempList)

1
lahsrah

Je ne suis pas tout à fait sûr de ce que vous essayez de faire ici, mais je vous garantis que vous ne voulez pas voir la même liste dans toutes les entrées de dictionnaire.

templist est votre problème d'échange templist.Clear() pour templist = new List<Long>()

Ou aller chercher

for (int index = 0; index < 5; index++)
{
if (!testList.ContainsKey(key[Index]))
{
testList.Add(key[Index], new List<Long>());
}
testList[key[index]].Add(val[index]);
}
0
Tony Hopkinson