我有两个数据结构:Dictionary<string, string>
和 Multimap<string, string>
。
Multimap 其实就是在底层使用了一个 Dictionary。我借鉴了这个问题上的大部分代码。以下是类的定义:
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
。 - Dave Zych