【发布时间】:2013-02-19 18:13:55
【问题描述】:
我有 2 个数据结构:Dictionary<string, string> 和 Multimap<string, string>。
Multimap 实际上只是引擎盖下的字典。我必须从this question 获取代码。这是类定义:
public class Multimap<TKey, TValue> : Dictionary<TKey, HashSet<TValue>>
{ ... }
两种数据结构都有一个.Add(TKey key, TValue value) 方法。
我有一个类负责从某些文件中填充这些映射。我目前有以下两种方法:
public Dictionary<string, string> PopulateDictionary(...)
{
Dictionary<string, string> returnDictionary = new Dictionary<string, string>();
...
foreach (...)
{
...
returnDictionary.Add(key, value);
}
return returnDictionary;
}
public Multimap<string, string> PopulateMultimap(...)
{
Multimap<string, string> returnMultimap = new Multimap<string, string>();
...
foreach (...)
{
...
returnMultimap.Add(key, value);
}
return returnMultimap;
}
如您所见,它们完全相同,都大约 25 行长,唯一的区别是它们的返回类型。我要做的就是将其浓缩为一种方法。 我的第一次尝试是有方法
public Dictionary<string, object> PopulateGenericDictionary(...)
{ ... }
其中object 是string 或HashSet<string>。但是我从Dictionary<string, object> 转换到Multimap<string, string> 时运气不佳。
从方法中提取逻辑是一种选择,但这不是很好。由于 foreach 循环,这两种方法中总会有一些逻辑。你最终得到的方法确实是原来的两倍,但仍然有两个相同的方法,这并不能真正解决问题。
这将是我理想的方法结构:
public Dictionary<string, string> PopulateDictionary(...)
{
return MethodThatDoesAllTheLogic(...);
}
public Multimap<string, string> PopulateMultimap(...)
{
return MethodThatDoesAllTheLogic(...);
}
public ??? MethodThatDoesAllTheLogic(...)
{ ... }
我一直在摆弄铸造和泛型,但我就是无法让它发挥作用。有什么想法吗?
编辑
我使用了millimoose 的解决方案。这是我的代码:
public Dictionary<string, string> GenerateDictionary(...)
{
Dictionary<string, string> returnMap = new Dictionary<string, string>();
PopulateDictionary(returnMap.Add, ...);
return returnMap;
}
public Multimap<string, string> GenerateMultimap(...)
{
Multimap<string, string> returnMap = new Multimap<string, string>();
PopulateDictionary(returnMap.Add, ...);
return returnMap;
}
private static void PopulateGenericDictionary(Action<string, string> addFunc, ...)
{
...
foreach (...)
{
addFunc(key, value);
}
}
干净多了!
【问题讨论】:
-
返回
Dictionary<TKey, TValue>有什么问题?这是可能的,因为 Multimap 扩展了 Dictionary。Multimap中是否有您需要的特别之处?如有必要,您可以返回字典,然后尝试转换为Multimap -
也许是字典
?
标签: c# generics dictionary casting