在C#中编译通用字典

Sve*_*ven 1 c# generics dictionary casting

有没有办法在C#.net 3中输入一个字典而不需要所有开销?

var result = new Dictionary<string, AccessoryVariant>();
foreach (BaseVariant variant in mVariants.Values)
{
    result.Add(variant.Id, (AccessoryVariant)variant);
}
return result;
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

return (Dictionary<string, AccessoryVariant>)mVariants;
Run Code Online (Sandbox Code Playgroud)

/斯文

Jon*_*eet 10

假设您使用的是.NET 3.5或4,则可以ToDictionary在LINQ中使用该方法:

return mVariants.Values.ToDictionary(v => v.Id, v => (AccessoryVariant) v);
Run Code Online (Sandbox Code Playgroud)

或者:

return mVariants.Values.Cast<AccessoryVariant>().ToDictionary(v => v.Id);
Run Code Online (Sandbox Code Playgroud)

或者(假设mVariants已经使用Id作为密钥):

return mVariants.ToDictionary(pair => pair.Key,
                              pair => (AccessoryVariant) pair.Value);
Run Code Online (Sandbox Code Playgroud)

请注意,您不能直接转换字典,因为假设mVariant是a Dictionary<string, BaseVariant>,有人可以将非AccessoryVariant作为值添加到字典中,这显然会弄乱任何(合理地)假设Dictionary<string, AccessoryVariant>唯一包含的AccessoryVariant值的代码.