アイテムの値を変更しようとすると、読み取り専用フィールドしかないため、問題が発生しました。
KeyValuePair<Tkey, Tvalue>
私は次のようなさまざまな代替案を試しました:
Dictionary<Tkey, Tvalue>
しかし、私は同じ問題を抱えています。値フィールドを新しい値に設定する方法はありますか?
変更することはできません。新しいものと交換することができます。
var newEntry = new KeyValuePair<TKey, TValue>(oldEntry.Key, newValue);
または辞書の場合:
dictionary[oldEntry.Key] = newValue;
ここで、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のどこでも使用できます。
KeyValuePair<TKey, TValue>
不変です。変更されたキーまたは値を使用して新しいものを作成する必要があります。次に実際に何をするかは、シナリオと、正確に何をしたいかによって異なります...
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));
}
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;
};
はKeyValuePair<TKey, TValue>
構造体であり、C#の構造体は値型であり、不変であると言われています。理由は明らかDictionary<TKey,TValue>
です。高性能のデータ構造である必要があります。値型の代わりに参照型を使用すると、メモリのオーバーヘッドが多すぎます。ディクショナリに直接格納された値型とは異なり、さらにディクショナリの各エントリに32ビットまたは64ビットの参照が割り当てられます。これらの参照は、エントリインスタンスのヒープを指します。全体的なパフォーマンスは急速に低下します。
Dictionary<TKey,TValue>
次の条件を満たすクラスよりも構造体を選択するためのMicrosoftの規則。
✔️タイプのインスタンスが小さく、一般的に短命であるか、一般的に他のオブジェクトに埋め込まれている場合は、クラスの代わりに構造体を定義することを検討してください。
❌タイプに次のすべての特性がない限り、構造体の定義は避けてください。
Dictionary<long, int> _rowItems = new Dictionary<long, int>();
_rowItems.Where(x => x.Value > 1).ToList().ForEach(x => { _rowItems[x.Key] = x.Value - 1; });
辞書の場合、いくつかの条件に基づいて、この方法で値を更新できます。