Як змінити значення KeyValuePair?


81

У мене виникла проблема при спробі змінити значення елемента, оскільки воно є лише полем для читання.

KeyValuePair<Tkey, Tvalue>

Я пробував різні альтернативи, такі як:

Dictionary<Tkey, Tvalue>

але там у мене така сама проблема. Чи є спосіб встановити нове значення для поля значення?


Ви намагаєтесь оновити певне значення, або всі / більшість значень у словнику?
J0HN

Я намагаюся оновити конкретне значення.
Кімбо,

Відповіді:


126

Ви не можете змінити його, ви можете замінити його новим.

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

або для словника:

dictionary[oldEntry.Key] = newValue;

Спасибі за вашу допомогу. Частина зі словником - це саме те, що мені потрібно.
Кімбо,

13

Ось, якщо ви хочете зробити KeyValuePair змінним.

Зробіть власний клас.

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;
    }
}

тож ми можемо змусити його використовувати будь-де в KeyValuePair.


9

KeyValuePair<TKey, TValue>є незмінним. Вам потрібно створити новий із модифікованим ключем або значенням. Що ви насправді робитимете далі, залежить від вашого сценарію, і що саме ви хочете зробити ...


Я можу змінити KeyValuePair <>. Ніколи не недооцінюйте P / Invoke.
Джошуа

1

KeyValuePair є незмінним,

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();
  }
}

Якщо у вас є якесь значення в KeyValuePair, яке ви хочете оновити, тоді ви можете спробувати видалити існуюче значення, а потім додати змінене значення

Для прикладу:

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>Є структура і структура в C # є типом значення і згадуються бути незмінними. Причина очевидна, це Dictionary<TKey,TValue>повинна бути високопродуктивна структура даних. Використання посилального типу замість типу значення призвело б до занадто великих витрат пам'яті. На відміну від безпосередньо збереженого типу значення у словнику, крім того, для кожного запису в словнику буде виділено 32-бітне або 64-бітне посилання. Ці посилання будуть вказані на купу для екземпляру входу. Загальна ефективність швидко знизилася б.

Правила Microsoft щодо вибору структури над класом, який Dictionary<TKey,TValue>задовольняє:

✔️ ВРУЧАЙТЕ, визначивши структуру замість класу, якщо екземпляри типу малі та часто короткочасні або зазвичай вбудовані в інші об’єкти.

❌ УНИКНУТИ визначення структури, якщо тип не має усіх перелічених нижче характеристик:

  • Він логічно представляє одне значення, подібне до примітивних типів (int, double тощо).
  • Він має розмір екземпляра менше 16 байт.
  • Він незмінний.
  • Її не доведеться часто боксувати.

0

Ви не можете змінити KeyValuePair, але можете змінити значення словника таким чином:

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

або ось так:

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; });

Для Словника ми можемо оновлювати значення таким чином на основі деяких умов.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.