c# 字典和 OrderedDictionaries 的通用合并方法
c# generic Merge Method for Dictionaries and OrderedDictionaries
我创建了以下辅助方法来合并字典(覆盖重复值):
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 一起使用
- Return 与源相同类型的字典
知道如何实现它或对我的功能进行任何其他改进吗?
我能想到几个方法(none 其中非常棒)
1) 如果你不介意修改源字典,只需添加它并return它,而不是做新字典
2) 如果调用者知道具体的字典类型,你可以显式调用泛型方法并告诉它什么类型 return 或者:
3) 您可以在具体类型
上使用泛型 class
4) 不要直接使用字典 classes,而是从它们派生并使它们可 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();
我创建了以下辅助方法来合并字典(覆盖重复值):
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 一起使用
- Return 与源相同类型的字典
知道如何实现它或对我的功能进行任何其他改进吗?
我能想到几个方法(none 其中非常棒)
1) 如果你不介意修改源字典,只需添加它并return它,而不是做新字典
2) 如果调用者知道具体的字典类型,你可以显式调用泛型方法并告诉它什么类型 return 或者:
3) 您可以在具体类型
上使用泛型 class4) 不要直接使用字典 classes,而是从它们派生并使它们可 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();