【问题标题】:Generic Function within a static non-generic class?静态非泛型类中的泛型函数?
【发布时间】:2014-03-22 21:29:53
【问题描述】:

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

public static Dictionary<T, U> DictionaryFromArrays(T[] keys, U[] values)

显然行不通。

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

【问题讨论】:

  • 看不出public static Dictionary&lt;T, U&gt; DictionaryFromArrays&lt;T, U&gt;(T[] keys, U[] values)不起作用的任何明显原因...
  • 谢谢!忘了把 放在方法名和参数之间。

标签: c# generics static


【解决方案1】:

你应该为方法声明你的泛型类型 (DictionaryFromArrays&lt;T, U&gt;):

public static Dictionary<T, U> DictionaryFromArrays<T, U>(T[] keys, U[] values)

【讨论】:

  • 谢谢!这正是我想要的!
【解决方案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;
}

【讨论】:

    【解决方案3】:

    你快到了:

     public static Dictionary<T, U> DictionaryFromArrays<T,U>(T[] keys, U[] values) 
     {return ....;}
    

    您需要在签名中指定类型,而不仅仅是在参数/返回值中。

    注意:此模式在 LINQ 的 Enumerable 中大量使用 - 静态非泛型类中的静态扩展方法。

    【讨论】:

      【解决方案4】:

      泛型类型缺失:方法的圆括号前&lt;TKey, TValue&gt;

      这是一个应该可行的可能实现:

      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;
          }
      }
      

      【讨论】:

        【解决方案5】:

        您可以将 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);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-28
          相关资源
          最近更新 更多