需要一个我自己的自定义对类型的字典?

时间:2011-01-12 19:39:45

标签: c# dictionary

KeyValuePair未实现INotifyPropertyChanged,因此我实现了自己的Pair类型,但我想在字典中使用它。

最简单的方法是什么?


所以这是交易。在我的代码中,我需要一个带键/值对的字典。这实际上不需要是可观察的。

我有一个编辑窗口,它在数据网格中显示这个dict。这需要是可观察的,以便数据网格可以发挥其魔力。

所以我所做的就是让编辑窗口接受任意数量的对:

    public ObservableCollection<Pair<string,object>> Variables { get; private set; }

    public VariablesWindow(IEnumerable<Pair<string, object>> vars)
    {
        Variables = new ObservableCollection<Pair<string, object>>(vars.DeepCopy());

这样它就可以做到。然后在主代码中我使用像普通的dict,但是当我打开编辑窗口时,我必须将dict转换为编辑窗口可以使用的东西:

var window = new VariablesWindow(Dict2Enum(_dict));

所以我添加了这两个辅助方法:

    private static IEnumerable<Pair<TKey, TValue>> Dict2Enum<TKey, TValue>(Dictionary<TKey, TValue> dict)
    {
        return dict.Select(i => new Pair<TKey, TValue>(i.Key, i.Value));
    }

    private static Dictionary<TKey, TValue> Enum2Dict<TKey, TValue>(IEnumerable<Pair<TKey, TValue>> collection)
    {
        return collection.ToDictionary(p => p.Key, p => p.Value);
    }

虽然看起来有点贵。我现在两次循环收集。一旦将字典转换为可枚举,然后再次深度复制它,以便变量在用户点击保存之前不会被更改,然后我将该可枚举转换为可观察集合。

2 个答案:

答案 0 :(得分:2)

您是否尝试通知更改?如果是这样,我会考虑编写一个支持Wrapper<T>的{​​{1}}类,然后使用(例如)INotifyPropertyChanged(对于支持更改通知的“string / int”字典)。

请注意,这意味着任何保留对包装器的引用的人都会看到对该值所做的更改 - 这是您必须非常小心的事情。

编辑:稍微扩展我的评论......

如果你也希望能够编辑密钥,我怀疑你会想要一个可变的TKey / TValue对,你需要一个Dictionary<string, Wrapper<int>>。您需要支持Dictionary<TKey, MutablePair<TKey, TValue>>以及INotifyPropertyChanging,它会变得毛茸茸......您可能需要通过INotifyPropertyChanged上的键删除它,然后在INotifyPropertyChanging上重新添加。毫无疑问,如果改变被中途放弃,事情会变得混乱。如果一个键覆盖了另一个键,你还需要弄清楚你想要发生什么......然后原始对象被改变了:

INotifyPropertyChanged

基本上有很多语义需要仔细考虑真的,然后才能进一步思考。

我建议您为要实现的行为编写 lot 单元测试,然后看看你能做些什么。

答案 1 :(得分:1)