KeyValuePair値を変更する方法は?


81

アイテムの値を変更しようとすると、読み取り専用フィールドしかないため、問題が発生しました。

KeyValuePair<Tkey, Tvalue>

私は次のようなさまざまな選択肢を試しました:

Dictionary<Tkey, Tvalue>

しかし、私は同じ問題を抱えています。値フィールドを新しい値に設定する方法はありますか?


特定の値を更新しようとしていますか、それとも辞書のすべて/ほとんどの値を更新しようとしていますか?
J0HN 2012年

特定の値を更新しようとしています。
キンボ2012年

回答:


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ビットの参照が割り当てられます。これらの参照は、エントリインスタンスのヒープを指します。全体的なパフォーマンスは急速に低下します。

以下をDictionary<TKey,TValue>満たすクラスよりも構造体を選択するためのMicrosoftの規則。

✔️タイプのインスタンスが小さく、一般的に短命であるか、一般的に他のオブジェクトに埋め込まれている場合は、クラスの代わりに構造体を定義することを検討してください。

❌型に次のすべての特性がない限り、構造体の定義は避けてください。

  • プリミティブ型(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; });

辞書の場合、いくつかの条件に基づいて、この方法で値を更新できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.