簡體   English   中英

靜態非泛型類中的泛型函數?

[英]Generic Function within a static non-generic class?

我的項目中有一個靜態類“ Extras”,用於放置不屬於任何其他類的方法(例如轉換器)。 我想添加一個稱為DictionaryFromArrays()的函數,該函數用於基於作為參數傳遞的兩個數組創建一個Dictionary:一個數組填充鍵,另一個數組填充值。 但是,我是泛型新手,並且使用

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

顯然是行不通的。

我知道這顯然不是使用泛型的正確方法,但是如何創建具有這種作用的函數呢?

您應該為方法聲明通用類型( DictionaryFromArrays<T, U> ):

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

您可以這樣做:

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

您幾乎在那里:

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

您需要在簽名中指定類型,而不僅僅是參數/返回值。

注意:此模式在LINQ的Enumerable靜態非泛型類中的靜態擴展方法中大量使用。

缺少通用類型:方法的圓括號之前為<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;
    }
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM