0

KeyValuePair 構造体には読み取り専用のプロパティ (Key と Value) があるため、それを置き換えるためにカスタム クラスを作成しました。

public class XPair<T, U>
{
    // members
    private KeyValuePair<T, U> _pair;

    // constructors
    public XPair()
    {
        _pair = new KeyValuePair<T, U>();
    }
    public XPair(KeyValuePair<T, U> pair)
    {
        _pair = pair;
    }

    // methods
    public KeyValuePair<T, U> pair
    {
        get { return _pair; }
        set { _pair = value; }
    }
    public T key
    {
        get { return _pair.Key; }
        set { _pair = new KeyValuePair<T, U>(value, _pair.Value); }
    }
    public U value
    {
        get { return _pair.Value; }
        set { _pair = new KeyValuePair<T, U>(_pair.Key, value); }
    }
}

このクラスは Dictionary での "foreach" の使用にも適用できますか? 例:

Dictionary<String, Object> dictionary = fillDictionaryWithData();
foreach(XPair<String, Object> pair in dictionary) {
    // do stuff here
}
4

1 に答える 1

3

これは、クラスがからの変換演算子を実装する場合に可能になりますKeyValuePair<TKey, TValue>

pairただし、ループ内のキーまたは値を変更しても、に影響がないため、期待どおりに機能しませんdictionary。辞書のキーと値は変更されません。

辞書内の値を変更したい場合は、単にdictionary[key] = newValue;

キーを変更したい場合は、実際には必要ないと思いますDictionary<TKey, TValue>。がIEnumerable<XPair<TKey, TValue>>より適切かもしれません。
辞書が本当に必要な場合は、次のコードを使用してキーを「変更」できます。

var value = dictionary[key];
dictionary.Remove(key);
dictionary.Add(newKey, value);
于 2013-02-14T15:33:22.383 に答える