と の 2 つのデータ構造がDictionary<string, string>
ありMultimap<string, string>
ます。Multimap は、実際にはボンネットの下にある単なる辞書です。この質問からコードを取得しました。クラス定義は次のとおりです。
public class Multimap<TKey, TValue> : Dictionary<TKey, HashSet<TValue>>
{ ... }
どちらのデータ構造にも.Add(TKey key, TValue value)
メソッドがあります。
特定のファイルからこれらのマップを作成するクラスがあります。現在、次の2つの方法があります。
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 行の長さでまったく同じであり、唯一の違いは戻り値の型です。私がやろうとしているのは、これを1つの方法に凝縮することです。私の最初の試みは、メソッドを持つことでした
public Dictionary<string, object> PopulateGenericDictionary(...)
{ ... }
object
またはのどちらstring
かでしHashSet<string>
た。Dictionary<string, object>
しかし、 からにキャストするのはあまり運がありませんでしたMultimap<string, string>
。
メソッドからロジックを抽出することはオプションですが、それは素晴らしいことではありません。foreach ループのため、2 つのメソッド内には常に何らかのロジックが存在します。最終的にメソッドは 2 倍小さくなりますが、それでも 2 つの同一のメソッドが存在するため、問題を真に解決することはできません。
これは私の理想的なメソッド構造です。
public Dictionary<string, string> PopulateDictionary(...)
{
return MethodThatDoesAllTheLogic(...);
}
public Multimap<string, string> PopulateMultimap(...)
{
return MethodThatDoesAllTheLogic(...);
}
public ??? MethodThatDoesAllTheLogic(...)
{ ... }
私はキャストとジェネリックをいじっていますが、うまくいきません。何か案は?
編集
ミリムースのソリューションを使用しました。ここに私のコードがあります:
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);
}
}
もっときれいに!