Je n'arrive pas à comprendre comment ajouter des éléments à un ImmutableList à l'intérieur d'un ImmutableDictionary.

J'ai la variable suivante:

ImmutableDictionary<string, ImmutableList<string>> _attributes = ImmutableDictionary<string, ImmutableList<string>>.Empty;

À quoi j'essaye d'ajouter une valeur à l'intérieur de la liste:

string[] attribute = line.Split(':');
if (!_attributes.ContainsKey(attribute[0]))
    _attributes = _attributes.Add(attribute[0], ImmutableList<string>.Empty);
if (attribute.Length == 2)
    _attributes[attribute[0]] = _attributes[attribute[0]].Add(attribute[1]);

Cependant, j'obtiens une erreur disant que le ImmutableList n'a pas de setter. Comment remplacer la liste dans le dictionnaire sans avoir à reconstruire l'intégralité du dictionnaire?

0
jscarle 2 févr. 2021 à 16:57

2 réponses

La réponse était sous mon nez. Tout comme je dois appeler Add et écraser la variable d'origine lors de l'ajout d'éléments, je dois appeler SetItem sur le dictionnaire. Logique!

1
jscarle 2 févr. 2021 à 14:05

Vous pouvez utiliser le {{X0} }, afin de réduire les recherches dans le dictionnaire de 3 à 2.

var _attributes = ImmutableDictionary.Create<string, ImmutableList<string>>();

string[] parts = line.Split(':');
if (parts.Length == 2)
{
    string attributeName = parts[0];
    string attributeValue = parts[1];

    if (_attributes.TryGetValue(attributeName, out var list))
    {
        _attributes = _attributes.SetItem(attributeName, list.Add(attributeValue));
    }
    else
    {
        _attributes = _attributes.Add(attributeName, ImmutableList.Create(attributeValue));
    }
}

Si vous souhaitez mettre à jour le dictionnaire avec thread-safety en tant qu'opération atomique, vous pouvez utiliser ImmutableInterlocked.AddOrUpdate méthode:

ImmutableInterlocked.AddOrUpdate(ref _attributes, attributeName,
    _ => ImmutableList.Create(attributeValue),
    (_, existing) => existing.Add(attributeValue));
0
Theodor Zoulias 2 févr. 2021 à 21:43