Jak zmodyfikować wartość KeyValuePair?


82

Wystąpił problem, gdy próbuję zmodyfikować wartość elementu, ponieważ jest to pole tylko do odczytu.

KeyValuePair<Tkey, Tvalue>

Próbowałem różnych alternatyw, takich jak:

Dictionary<Tkey, Tvalue>

ale tam mam ten sam problem. Czy istnieje sposób, aby ustawić pole wartości na nową wartość?


Czy próbujesz zaktualizować określoną wartość, czy wszystkie / większość wartości w słowniku?
J0HN

Próbuję zaktualizować określoną wartość.
Kimbo

Odpowiedzi:


126

Nie możesz go zmodyfikować, możesz go zastąpić nowym.

var newEntry = new KeyValuePair<Tkey, Tvalue>(oldEntry.Key, newValue);

lub do słownika:

dictionary[oldEntry.Key] = newValue;

Dzięki za pomoc. Część ze słownikiem jest dokładnie tym, czego potrzebuję.
Kimbo

13

Tutaj, jeśli chcesz, aby KeyValuePair był mutowalny.

Utwórz własną klasę.

public class KeyVal<Key, Val>
{
    public Key Id { get; set; }
    public Val Text { get; set; }

    public KeyVal() { }

    public KeyVal(Key key, Val val)
    {
        this.Id = key;
        this.Text = val;
    }
}

więc możemy używać go wszędzie w KeyValuePair.


9

KeyValuePair<TKey, TValue>jest niezmienna. Musisz utworzyć nowy za pomocą zmodyfikowanego klucza lub wartości. To, co faktycznie zrobisz dalej, zależy od twojego scenariusza i co dokładnie chcesz zrobić ...


Mogę zmodyfikować KeyValuePair <>. Nigdy nie lekceważ P / Invoke.
Joshua,

1

KeyValuePair jest niezmienna,

namespace System.Collections.Generic
{
  [Serializable]
  public struct KeyValuePair<TKey, TValue>
  {
    public KeyValuePair(TKey key, TValue value);
    public TKey Key { get; }
    public TValue Value { get; }
    public override string ToString();
  }
}

Jeśli masz jakąkolwiek istniejącą wartość w KeyValuePair, którą chcesz zaktualizować, możesz spróbować usunąć istniejącą wartość, a następnie dodać zmodyfikowaną wartość

Dla przykładu:

var list = new List<KeyValuePair<string, int>>();
list.Add(new KeyValuePair<string, int>("Cat", 1));
list.Add(new KeyValuePair<string, int>("Dog", 2));
list.Add(new KeyValuePair<string, int>("Rabbit", 4));

int removalStatus = list.RemoveAll(x => x.Key == "Rabbit");

if (removalStatus == 1)
{
    list.Add(new KeyValuePair<string, int>("Rabbit", 5));
}

1

KeyValuePair<TKey, TValue>Jest struktura i struktura w C # jest typ wartości i wspomniał być niezmienna. Powód jest oczywisty, Dictionary<TKey,TValue>powinna to być struktura danych o wysokiej wydajności. Użycie typu referencyjnego zamiast typu wartości spowodowałoby zbyt duże obciążenie pamięci. W przeciwieństwie do bezpośrednio przechowywanych typów wartości w słowniku, dodatkowo przydzielane byłyby odwołania 32- lub 64-bitowe dla każdego wpisu w słowniku. Te odniesienia byłyby wskazywane na stertę dla instancji wejścia. Ogólna wydajność gwałtownie spadłaby.

Zasady firmy Microsoft dotyczące wybierania struktury zamiast klasy, która Dictionary<TKey,TValue>spełnia:

✔️ ROZWAŻ zdefiniowanie struktury zamiast klasy, jeśli wystąpienia tego typu są małe i zwykle krótkotrwałe lub są często osadzone w innych obiektach.

❌ UNIKAJ definiowania struktury, chyba że typ ma wszystkie następujące cechy:

  • Logicznie reprezentuje pojedynczą wartość, podobnie jak typy pierwotne (int, double itp.).
  • Ma rozmiar instancji poniżej 16 bajtów.
  • To jest niezmienne.
  • Nie będzie trzeba go często pakować w pudełka.

0

Nie możesz modyfikować KeyValuePair, ale możesz zmodyfikować wartości słownika w następujący sposób:

foreach (KeyValuePair<String, int> entry in dict.ToList())
{
    dict[entry.Key] = entry.Value + 1;
}

lub tak:

foreach (String entry in dict.Keys.ToList())
{
    dict[entry] = dict[entry] + 1;
};

0
Dictionary<long, int> _rowItems = new Dictionary<long, int>();
  _rowItems.Where(x => x.Value > 1).ToList().ForEach(x => { _rowItems[x.Key] = x.Value - 1; });

W przypadku słownika możemy w ten sposób aktualizować wartości na podstawie pewnych warunków.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.