为了账号安全,请及时绑定邮箱和手机立即绑定

合并C#中的字典

合并C#中的字典

C#
当年话下 2019-07-05 10:43:35
合并C#中的字典合并两个或更多字典的最佳方法是什么(Dictionary<T1,T2>)在C#中(像LINQ这样的3.0特性很好)。我正在考虑一个方法签名,大意是:public static Dictionary<TKey,TValue>                  Merge<TKey,TValue>(Dictionary<TKey,TValue>[] dictionaries);或public static Dictionary<TKey,TValue>                  Merge<TKey,TValue>(IEnumerable<Dictionary<TKey,TValue>> dictionaries);编辑:从JaredPar和JonSkeet那里得到了一个很酷的解决方案,但是我在想一些处理重复密钥的方法。在冲突的情况下,只要是一致的,哪个值被保存到DECT中并不重要。
查看完整描述

3 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

这在一定程度上取决于当你遇到重复时你想要发生什么。例如,您可以:

var result = dictionaries.SelectMany(dict => dict)
                         .ToDictionary(pair => pair.Key, pair => pair.Value);

如果你有任何重复的钥匙就会爆炸。

编辑:如果您使用ToLookup,那么您将得到一个查找,其中每个键可以有多个值。你,你们然后将其转换为字典:

var result = dictionaries.SelectMany(dict => dict)
                         .ToLookup(pair => pair.Key, pair => pair.Value)
                         .ToDictionary(group => group.Key, group => group.First());

这有点难看-而且效率很低-但这是在代码方面最快的方法。(无可否认,我还没有测试过它。)

当然,您可以编写自己的ToDictionary2扩展方法(使用更好的名称,但我现在没有时间考虑)-这并不难,只需要覆盖(或忽略)重复的键。重要的一点(在我看来)是使用SelectMany,并意识到字典支持其键/值对的迭代。


查看完整回答
反对 回复 2019-07-05
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

我会这样做:

dictionaryFrom.ToList().ForEach(x => dictionaryTo.Add(x.Key, x.Value));

简单容易。根据这篇博客文章它甚至比大多数循环都要快,因为它的底层实现通过索引而不是枚举器访问元素。(见这个答案).

当然,如果存在重复项,则会抛出异常,因此在合并之前必须进行检查。


查看完整回答
反对 回复 2019-07-05
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

好吧,我去派对迟到了,但这是我的用武之地。如果有多个键(“连”键代替“左”键),可以合并许多字典(如果需要的话),并保留类型(限制是它需要有意义的默认公共构造函数),它就不会爆炸:

public static class DictionaryExtensions{
    // Works in C#3/VS2008:
    // Returns a new dictionary of this ... others merged leftward.
    // Keeps the type of 'this', which must be default-instantiable.
    // Example: 
    //   result = map.MergeLeft(other1, other2, ...)
    public static T MergeLeft<T,K,V>(this T me, params IDictionary<K,V>[] others)
        where T : IDictionary<K,V>, new()
    {
        T newMap = new T();
        foreach (IDictionary<K,V> src in
            (new List<IDictionary<K,V>> { me }).Concat(others)) {
            // ^-- echk. Not quite there type-system.
            foreach (KeyValuePair<K,V> p in src) {
                newMap[p.Key] = p.Value;
            }
        }
        return newMap;
    }}


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 1407 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信