合并 IDictionary - 有没有比这更有效的方法
本文关键字:有效 方法 IDictionary 有没有 合并 | 更新日期: 2023-09-27 18:32:45
我有一个帮助程序,它通过连接TValue
的ToString()
方法,将两个或多个IDictionary<TKey, TValue>
对象合并为一个IDictionary<TKey, string>
,如下所示:
public class DictionaryHelper<TKey, TValue>
{
public static IDictionary<TKey, string> MergeDictionaries<TKey, TValue>(params IDictionary<TKey, TValue>[] dictionaries) where TValue : class
{
var returnValue = new Dictionary<TKey, string>();
foreach (var dictionary in dictionaries)
{
foreach (var kvp in dictionary)
{
if (returnValue.ContainsKey(kvp.Key))
{
returnValue[kvp.Key] += kvp.Value.ToString();
}
else
{
returnValue[kvp.Key] = kvp.Value.ToString();
}
}
}
return returnValue;
}
}
虽然这很简单且非常易于阅读,但似乎应该有一种更有效的方法可以做到这一点。 有吗?
我不知道
这是否更有效,但至少它要短得多:
var result = dictionaries.SelectMany(d => d)
.ToLookup(kvp => kvp.Key, kvp => kvp.Value)
.ToDictionary(g => g.Key, g => string.Concat(g));
您可以使用
SelectMany
删除可见foreach
:
foreach (var kvp in dictionaries.SelectMany(dd => dd))
{
if (returnValue.ContainsKey(kvp.Key))
{
returnValue[kvp.Key] += kvp.Value.ToString();
}
else
{
returnValue[kvp.Key] = kvp.Value.ToString();
}
}
你可以进一步扩展它,尽管dtb的更优雅和高效:
var merged = dictionaries.SelectMany(dd => dd)
.GroupBy(kvp => kvp.Key, kvp => kvp.Value)
.ToDictionary(
gg => gg.Key,
gg => String.Concat(gg));
但是,这不太可能比您当前的方法更有效或更易读。
您可以使用 TryGetValue 来合并源值的位置和检索。