我有一个静态课程" Extras"在我的项目中,我用来放置不属于任何其他类的方法,例如转换器。我想添加一个名为DictionaryFromArrays()的函数,我用它来创建一个基于作为参数传递的两个数组的Dictionary:一个用键填充,另一个用值填充。但是,我是仿制药的新手,并且使用
public static Dictionary<T, U> DictionaryFromArrays(T[] keys, U[] values)
显然不起作用。
我知道这显然不是使用泛型的正确方法,但是如何创建具有该效果的函数呢?
答案 0 :(得分:3)
您应该为方法(DictionaryFromArrays<T, U>
)声明您的泛型类型:
public static Dictionary<T, U> DictionaryFromArrays<T, U>(T[] keys, U[] values)
答案 1 :(得分:2)
你可以这样做:
public static Dictionary<T, U> DictionaryFromArrays<T,U>(T[] keys, U[] values)
{
var dictionary = new Dictionary<T, U>();
if (keys.Length == values.Length)
{
for (int i = 0; i < keys.Length; i++)
{
dictionary.Add(keys[i], values[i]);
}
}
else
{
/* throw exception */
}
return dictionary;
}
答案 2 :(得分:1)
你快到了:
public static Dictionary<T, U> DictionaryFromArrays<T,U>(T[] keys, U[] values)
{return ....;}
您需要在签名中指定类型,而不仅仅是在arguments / return value中。
注意:此模式在LINQ的Enumerable
- 静态非泛型类中的静态扩展方法中大量使用。
答案 3 :(得分:1)
在方法的圆括号之前缺少通用类型:<TKey, TValue>
。
这是一个可能有效的实现:
public static Dictionary<K, V> DictionaryFromArrays<K, V>(K[] keys, V[] values, bool skipDuplicates)
{
if (keys == null) throw new ArgumentNullException("keys");
if (values == null) throw new ArgumentNullException("values");
if(keys.Length != values.Length) throw new ArgumentException("Keys and Values must have the same length!");
if (!skipDuplicates)
return keys.Zip(values, (k, v) => new KeyValuePair<K, V>(k, v))
.ToDictionary(kv => kv.Key, kv => kv.Value);
else
{
Dictionary<K, V> dict = new Dictionary<K,V>();
for (int i = 0; i < keys.Length; i++)
{
K key = keys[i];
if (!dict.ContainsKey(key))
dict.Add(key, values[i]);
}
return dict;
}
}
答案 4 :(得分:1)
您可以使用索引版本的LINQ Select。
public static Dictionary<T, U> DictionaryFromArrays<T,U>(T[] keys, U[] values)
{
return keys
.Select((k, idx) => new {key = k, value = values[idx]})
.ToDictionary(x => key, y => value);
}