我已经创建了自定义类,以针对键管理多个值的字典:
public sealed class MultiDictionary<TKey, TValue> : Dictionary<TKey, HashSet<TValue>>
{
// Class implementation
}
我在代码中使用它,就像这样:
HashSet<Dictionary<String, String>> myHashSet; // Fill in values
MultiDictionary<String, Dictionary<String, String>> myDictionary = myHashSet
.GroupBy(row => row["ID"])
.ToDictionary(var => var.Key, var => var.ToHashSet());
但是,当我编译该代码时,出现以下错误。我一定会错过一些非常简单的东西,但对我来说,这两种类型(转换为和转换为)看起来都一样。
Cannot implicitly convert type
'System.Collections.Generic.Dictionary<string, System.Collections.Generic.HashSet<System.Collections.Generic.Dictionary<string, string>>>' to
'MultiDictionary<string, System.Collections.Generic.Dictionary<string, string>>'.
An explicit conversion exists (are you missing a cast?)
足够有趣的是,如果我将代码更改为如下所示,错误就会消失:
HashSet<Dictionary<String, String>> myHashSet; // Fill in values
Dictionary<String, HashSet<Dictionary<String, String>>> myDictionary = myHashSet
.GroupBy(row => row["ID"])
.ToDictionary(var => var.Key, var => var.ToHashSet());
我的原始代码有什么问题?
答案 0 :(得分:1)
您正试图将一个较抽象的类型隐式转换为一个不太抽象的类型。
通过从Dictionary<TKey, HashSet<TValue>>
继承,您创建了一个特殊化,不能直接从其继承的类型中进行分配。
最简单的答案是使用合成而不是继承,并让您的“ MultiDictionary”包含一个Dictionary<TKey, HashSet<TValue>>
这将允许您定义一个接受Dictionary<TKey, HashSet<TValue>>
的构造函数并将其分配给成员变量。
它还允许您使用隐式转换运算符(我不特别建议您这么做,因为它是该语言使用较少的功能,将来可能会使维护程序员感到困惑,但是对于您上面的代码而言,您将需要删除“ MultiDictionary”和Dictionary<TKey, HashSet<TValue>>
并将以下方法添加到“ MultiDictionary”类中
public static implicit operator MultiDictionary<TKey, TValue>(Dictionary<TKey, HashSet<TValue>> d)
{
return new MultiDictionary<TKey, TValue>(d);
}
public static implicit operator Dictionary<TKey, HashSet<TValue>> (MultiDictionary<TKey, TValue> md)
{
return md.m_dictionaryOfHashSets;
}
与诸如C ++之类的语言一样,您可以依靠两个类的内存布局相同这一事实来执行令人讨厌的事情,而C#不允许这样做。 无论如何,您的MultiDictionary类在HashSets字典上增加了什么价值?您是否可以使用扩展方法来提供此功能?