字典和有序字典的c#泛型合并方法

问题描述 投票:0回答:1

我创建了以下帮助方法来合并字典(覆盖重复值):

public static IDictionary<T1, T2> Merge<T1, T2>(
    IDictionary<T1, T2> source, IDictionary<T1, T2> additional
) {
    var result = new Dictionary<T1, T2>(source);
    additional.ToList().ForEach(pair => result[pair.Key] = pair.Value);
    return result;
}

我想把它变成通用的,这样:

  • 我可以将它与OrderedDictionary一起使用
  • 返回与源相同类型的字典

知道如何实现它或我的功能的任何其他改进?

c# dictionary generics .net-core ordereddictionary
1个回答
1
投票

我可以想到几种方式(它们都不是很好)

1)如果你不介意修改源字典,只需添加并返回它,而不是做新的字典

2)如果调用者知道具体字典类型,则可以显式调用泛型方法并告诉它要返回的类型或:

3)您可以在具体类型上使用泛型类

4)不是直接使用字典类,而是从它们派生并使它们成为ICloneable。然后使用clone而不是new dictionary

编辑:

对于选项#2,我发现你并不真的需要显式泛型调用,显式强制转换就足够了。你可以有这样的代码:

namespace ConsoleApp1
{
    class Program
    {
        public static T Merge<T>( T source, IDictionary additional) where T:IDictionary,new()
        {
            var result = new T();
            foreach (var item in additional.Keys)
            {
                result.Add(item, additional[item]);
            }
            foreach (var item in source.Keys)
            {
                result.Add(item, source[item]);
            }
            return result;
        }

        static void Main(string[] args)
        {
            OrderedDictionary od = new OrderedDictionary();
            od["A"] = 1;

            System.Collections.Generic.Dictionary<String, Int32> dictionary = new System.Collections.Generic.Dictionary<String, Int32>();
            dictionary["B"] = 2;
            IDictionary od2 = Merge(od, dictionary);
            Console.WriteLine("output=" + od2["A"]+od2["B"]+od2.GetType());
            IDictionary dictionary2 = Merge(dictionary, od);
            Console.WriteLine("output=" + dictionary2["A"] + dictionary2["B"] + dictionary2.GetType());
            Console.ReadKey();
        }
    }
}

以下是一些注意事项:

1)您必须使用非泛型System.Collections.IDictionary作为参数类型。它是Dictionary和OrderedDictionary的常见词,因为OrderedDictionary不是泛型类型

2)要在T上执行新操作,并强制它只是IDictionaries,您必须添加where子句

3)如果你没有声明为具体类型的两个输入的变量,但只有它们的接口,那么事情变得很丑,然后你需要显式的转换(如下所示)。在这种情况下,最好选择#5选项并让调用者将他们想要的目标容器作为第三个参数传递

    IDictionary od = new OrderedDictionary();
    od["A"] = 1;
    System.Collections.Generic.IDictionary<String, Int32> dictionary = new System.Collections.Generic.Dictionary<String, Int32>();
    dictionary["B"] = 2;
    IDictionary od2 = Merge((OrderedDictionary)od, (System.Collections.Generic.Dictionary<String, Int32>) dictionary);
    Console.WriteLine("output=" + od2["A"]+od2["B"]+od2.GetType());
    IDictionary dictionary2 = Merge((System.Collections.Generic.Dictionary<String, Int32>)dictionary, od);
    Console.WriteLine("output=" + dictionary2["A"] + dictionary2["B"] + dictionary2.GetType());
    Console.ReadKey();
© www.soinside.com 2019 - 2024. All rights reserved.