静态非泛型类中的泛型函数?

时间:2014-03-22 21:29:54

标签: c# generics static

我有一个静态课程" Extras"在我的项目中,我用来放置不属于任何其他类的方法,例如转换器。我想添加一个名为DictionaryFromArrays()的函数,我用它来创建一个基于作为参数传递的两个数组的Dictionary:一个用键填充,另一个用值填充。但是,我是仿制药的新手,并且使用

public static Dictionary<T, U> DictionaryFromArrays(T[] keys, U[] values)
显然不起作用。

我知道这显然不是使用泛型的正确方法,但是如何创建具有该效果的函数呢?

5 个答案:

答案 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);
}