我有 2 个数据结构:Dictionary<string, string>
和Multimap<string, string>
. Multimap 实际上只是引擎盖下的字典。我从这个问题中提取了必须的代码。这是类定义:
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>
to 转换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);
}
}
干净多了!