Hoe een KeyValuePair-waarde wijzigen?

Ik heb een probleem wanneer ik de waarde van een item probeer te wijzigen, omdat het alleen een alleen-lezen veld is.

KeyValuePair<Tkey, Tvalue>

Ik heb verschillende alternatieven geprobeerd, zoals:

Dictionary<Tkey, Tvalue>

maar daar heb ik hetzelfde probleem. Is er een manier om het waardeveld op een nieuwe waarde in te stellen?


Antwoord 1, autoriteit 100%

Je kunt het niet wijzigen, je kunt het vervangen door een nieuwe.

var newEntry = new KeyValuePair<TKey, TValue>(oldEntry.Key, newValue);

of voor woordenboek:

dictionary[oldEntry.Key] = newValue;

Antwoord 2, autoriteit 13%

Hier, als u KeyValuePair veranderlijk wilt maken.

Maak een aangepaste les.

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

zodat we het overal in KeyValuePair kunnen gebruiken.


Antwoord 3, autoriteit 6%

KeyValuePair<TKey, TValue>is onveranderlijk. U moet een nieuwe maken met de gewijzigde sleutel of waarde. Wat u vervolgens doet, hangt af van uw scenario en wat u precies wilt doen…


Antwoord 4

KeyValuePair is onveranderlijk,

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

Als u een bestaande waarde in KeyValuePair heeft die u wilt bijwerken, kunt u proberen de bestaande waarde te verwijderen en vervolgens de gewijzigde waarde toevoegen

Voor een voorbeeld:

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

Antwoord 5

U kunt een KeyValuePair niet wijzigen, maar u kunt uw woordenboekwaarden wel als volgt wijzigen:

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

of zoals dit:

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

Antwoord 6

De KeyValuePair<TKey, TValue>is een struct en struct in C# is van het waardetype en wordt onveranderlijk genoemd. De reden ligt voor de hand, het Dictionary<TKey,TValue>zou een krachtige datastructuur moeten zijn. Het gebruik van een referentietype in plaats van een waardetype zou te veel geheugenoverhead kosten. In tegenstelling tot een direct opgeslagen waardetype in een woordenboek, zouden bovendien de 32-bits of 64-bits verwijzingen voor elk item in het woordenboek worden toegewezen. Deze verwijzingen zouden worden verwezen naar heap voor entry instance. De algehele prestaties zouden snel afnemen.

De Microsoft-regels voor het kiezen van struct boven klasse waaraan Dictionary<TKey,TValue>voldoet:

✔️ OVERweeg een struct te definiëren in plaats van een klasse als instanties van het type klein zijn en vaak van korte duur zijn of vaak zijn ingebed in andere objecten.

❌ VERMIJD het definiëren van een struct tenzij het type alle volgende kenmerken heeft:

  • Het vertegenwoordigt logischerwijs een enkele waarde, vergelijkbaar met primitieve typen (int, double, etc.).
  • Het heeft een instantiegrootte van minder dan 16 bytes.
  • Het is onveranderlijk.
  • Het hoeft niet vaak in dozen te worden gedaan.

Antwoord 7

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

Voor Woordenboek kunnen we op deze manier waarden bijwerken op basis van enkele voorwaarden.

Other episodes