7

データを保持するためにを使用しDictionary<int, KeyValuePair<bool, int>>ています。

時々、でをインクリメントする必要がありますintKeyValuePair、セッターがないため、それは私を許可しません。それを増やす方法はありますか?

コードサンプル:

Dictionary<int, KeyValuePair<bool, int>> mDictionary = 
    new Dictionary<int, KeyValuePair<bool, int>>();

mDictionary[trapType].Value++;
//Error: The property KeyValuePair<TKey, Tvalue>>.Value has no setter
4

7 に答える 7

22

それを増やす方法はありますか?

いいえ。KeyValuePair不変です。値型でもあるため、コピーの作成後Valueにプロパティの値を変更しても、とにかく役に立ちません。

あなたはこのような何かを書かなければならないでしょう:

var existingValue = mDictionary[trapType];
var newValue = new KeyValuePair<bool, int>(existingValue.Key,
                                           existingValue.Value + 1);
mDictionary[trapType] = newValue;

しかし、それはかなり醜いです-あなたは本当に価値が必要KeyValuePairですか?

于 2012-05-14T08:47:42.677 に答える
0
mDictionary[trapType] = new KeyValuePair<bool, int>(mDictionary[trapType].Key, mDictionary[trapType].Value+1)
于 2012-05-14T08:47:25.633 に答える
0

KeyValuePair辞書のイテレータ値として使用される傾向があります。可変にしたい場合は、独自のタイプを定義することをお勧めします。

于 2012-05-14T08:50:46.560 に答える
0

新しいキーと値のペアを作成する必要があります。

mDictionary[trapType] = new KeyValuePair<bool,int>(mDictionary[trapType].Key,mDictionary[trapType].Value +1);

ただし、.NET 4を使用しているTuple場合、他の2つの値を保持するオブジェクトを作成するだけであれば、キーと値のペアの代わりに使用することをお勧めします。つまり、2つの間にキーと値の関係がない場合です。その場合、コードは次のようになります。

mDictionary[trapType] = Tuple.Create(mDictionary[trapType].Item1,mDictionary[trapType].Item2 +1);
于 2012-05-14T08:54:13.007 に答える
0

別の解決策は、新しい辞書を作成し、それに新しい値とキーを渡すことです。

foreach (var d in existingDic)
                    newDic.Add(d.Key, d.Value + 1);
于 2012-06-19T16:23:01.710 に答える
0

概念的には、KeyValuePair<TKey,TValue>は単なる変数のペアでありKeyValue。Microsoftが公開されたパブリックフィールドでそれを実装していたらKeyValueそのセマンティクスは完璧だったでしょう。制御変数として使用した場合、ForEach不変でしたが、一方が他方を更新しなくても、通常の変数または配列要素のKeyまたはValueフィールドを更新できた可能性があります。

残念ながら、Microsoftは、フレームワーク型がパブリックフィールドを公開することを望んでいないようKeyValuePair<TKey,TValue>ですDrawing.Rectangle。(2)その状態全体が固定されたプロパティのセットに表示され(オブジェクトの状態を定義するもの以外に他の計算されたプロパティが存在する場合があります)、(3)それらのプロパティにはタイプに適した値の任意の組み合わせを割り当てることができます。したがって、Microsoftは、型の状態を構成するメンバーを読み取り専用プロパティまたは読み取り/書き込みプロパティとして公開する可能性のみを考慮しました。読み取り/書き込みプロパティを使用すると、次のようなコードになります。

for each (var item in myDictionary)
    item.Value += 1;

また

...assuming MyList is a List<Drawing.Rectangle>
MyList[3].Width += 9;

既存のC#コンパイラによって次のいずれかとして解釈されます

for each (var item in myDictionary)
{ var temp = item; temp .Value += 1; }

また

...assuming MyList is a List<Drawing.Rectangle>
{ temp = MyList[3]; temp.Width += 9; }

どちらも恐ろしい振る舞いを生み出しますが、これはプログラマーが意図したものではないことはほぼ間違いありません。.netの実装者は、のメンバーをKeyValuePair<TKey,TValue>個別に変更可能にすることの価値は、前者がもたらす危険を正当化するものではないと判断しましたが、の個々のメンバーを変更することの有用性はRectangle、2番目がもたらす危険を正当化するのに十分でした。プロパティセッターを呼び出した場合でも、一時構造体のフィールドへの書き込みは許可されていなかったため、タイプがプロパティではなく公開フィールドを使用していれば、どちらの例も危険をもたらす必要はなかったことに注意してください。

于 2012-12-12T19:52:50.073 に答える
0

前述のように、KeyValuePairは不変です。ここに変更可能な実装を追加する価値があると思いました。

public class MutableKeyValuePair<KeyType, ValueType>
    {
        public KeyType Key { get; set; }
        public ValueType Value { get; set; }

        public MutableKeyValuePair() { }

        public MutableKeyValuePair(KeyType key, ValueType val)
        {
            Key = key;
            Value = val;
        }
    }
于 2017-09-15T10:54:27.933 に答える