Różnica pomiędzy Dicionary.Add() a dostępem po kluczu

0

Znajduję w logach podczas operacji dodawania Dictionary.Add() wyjątek
"Element z tym samym kluczem został już dodany'"

Zykle to robi się operatorem [] i wtedy nie ma wyjątku.

Co zamierzał autor i co wtedy jarał ?

5

System.Collections.Concurrent.ConcurrentDictionary<> ma AddOrUpdate()
Pomysł był taki aby była metoda która wykryje (rzuci wyjątkiem) że w danych masz błąd.

4

Ale

dictionary[a]=b;

to nie to samo co

dictionary.Add(a,b);

Ale rozumiem, że to wiesz i pytasz dlaczego ktoś tak to wymyślil? ;⁠-⁠)

8

Dictionary się używa przez []. Add zostało prawdopodobnie dodane dla inicjalizacji z ducktypingiem. Każda klasa może implementować IEnumerable i mieć metodę Add i wtedy można do niej dodawać elementy w ten sposób:

new Klasa
{
  "a", "b", "c"
}

Dzięki temu możesz utworzyć Dictionary podając parę klucz, wartość. Dzięki temu że rzuca exception łatwiej znaleźć niezamierzony błąd kiedy dwa razy próbujesz dodać ten sam klucz:

new Dictionary<int, string> {
    { 1, "111" },
    { 2, "222" },
    { 3, "333" },
    { 1, "444" }
};

od którejś tam wersji dodali możliwość tworzenia dictionary przez

new Dictionary<int, string> {
    [1] = "111",
    [2] = "222",
    [1] = "333"
 }

i tu już nie rzuca exceptiona, zapewne możnaby było już usunąć metodę Add ale to by zerwało wsteczną kompatybilność.
W skrócie - nie używaj

4
obscurity napisał(a):

Dictionary się używa przez []. Add zostało prawdopodobnie dodane dla inicjalizacji z ducktypingiem. Każda klasa może implementować IEnumerable i mieć metodę Add i wtedy można do niej dodawać elementy w ten sposób:

IEnumerable nie definiuje metody Add(). W przypadku słownika ta metoda jest definiowana przez IDictionary, ten sam interfejs definiuje odwołanie przy użyciu klucza ([])

Jestem święcie przekonany, że słownika używa się w taki sposób jaki jest to konieczne. Czasem trzeba mieć pewność, że próba aktualizacji wartości dla jakiegoś klucza rzuci wyjątkiem i wtedy Add() spisuje się doskonale.

0

to jest takie standardowe zachoanie
Add to dodanie i koniec
[] - ma dwa znaczenia - add or change

bodajże w cpp jest taka sama logika jeśli chodzi o []
nic niezwykłego

0

z czym problem?

4

Używanie kolekcji to tak najdalej 5 rozdział książki do nauki języka.

1
somekind napisał(a):

Używanie kolekcji to tak najdalej 5 rozdział książki do nauki języka.

Copyright (c) by ZrobieDobrze, ale primary author pisze o pierwszych 10 kartkach ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1