string[] filesOfType1 = GetFileList1();
string[] filesOfType2 = GetFileList2();
var cookieMap = new Dictionary<string, CookieContainer>();
Action<string, Func<string, KeyValuePair<string, CookieContainer>>> addToMap = (filename, pairGetter) =>
{
KeyValuePair<string, CookieContainer> cookiePair;
try
{
cookiePair = pairGetter(filename);
}
catch
{
Console.WriteLine("An error was encountered while trying to read " + file + ".");
return;
}
if (cookieMap.ContainsKey(cookiePair.Key))
{
if (cookiePair.Value.Count > cookieMap[cookiePair.Key].Count)
{
cookieMap[cookiePair.Key] = cookiePair.Value;
}
}
else
{
cookieMap.Add(cookiePair.Key, cookiePair.Value);
}
};
foreach (string file in filesOfType1)
{
addToMap(file, GetType1FileCookiePair);
}
foreach (string file in filesOfType2)
{
addToMap(file, GetType2FileCookiePair);
}
維持しなければならない顕著な特徴:
- タイプ 1 のファイルは、タイプ 2 のファイルよりも重要です。つまり、タイプ 1 のファイルが (キー、値 1) の組み合わせにマップされ、タイプ 2 のファイルが (キー、値 2) の組み合わせにマップされる場合、(キー、値 2) ではなく(キー、値 1)を cookieMap に追加します。編集:Bevanが指摘したように、これは私の元の手続き型コードでは満足できません。
- 次に、が高い
CookieContainer
sCount
ほど優先度が高くなります。つまり、同じキーに対して 2 つの (キー、値) コンボがあり、両方とも同じファイルタイプからのものである場合、 が高い方を選択しますvalue.Count
。 - ケースごとの例外処理は必須です。単一のファイル読み取りを台無しにするだけで、それに注意して続行できるようになります。
私の最善の試みは次のように始まりました:
var cookieMap = (filesOfType1.Select(file => GetType1FileCookiePair(file))
.Concat(filesOfType2.Select(file => GetType2FileCookiePair(file))))
.GroupBy(pair => pair.Key)
.Select(/* some way of selecting per the above bullets */)
.ToDictionary(pair => pair.Key, pair => pair.Value);
しかし、それは洗練されておらず、そのコメント ブロックに記入するのは雌犬のように思えます。今のところ、私は手続き型にとどまることに満足していますが、人々が本当に賢い何かを思いつくことができるかどうかを見るのは楽しい挑戦かもしれないと思いました.