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 的文件映射到 (key, value1) 组合,类型 2 的文件映射到 (key, value2) 组合,那么我们将 (key, value1) 添加到 cookieMap 而不是(key, value2)。编辑:正如 Bevan 所指出的,我原来的程序代码对此并不满意。
- 其次,具有更高优先级
CookieContainer
的 sCount
具有更高的优先级,即如果同一键有两个(键,值)组合并且都来自相同的文件类型,我们选择具有更高的一个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);
但这很不雅,并且填写该评论块似乎是个婊子。现在我很高兴保持程序化,但我认为看看人们是否能想出一些非常聪明的东西可能是一个有趣的挑战。