2010-03-05 13 views
2

我想創建一個函數,它將返回在運行時由我指定的類型列表。我試過這條線:將字符串數組轉換爲列表的通用方法

public static List<T> GetMyList<T>(string[] itemList) 
    { 
    List<T> resultList = new List<T>(itemList.Length); 
    return resultList.AddRange(itemList); 
    } 

但是這不起作用。顯然我不完全理解如何傳遞一個類型轉換爲。 任何幫助將不勝感激。

編輯: 看起來這是不可能的,但這裏有更多信息。字符串數組將包含數字,並且我想將這些數字有時轉換爲int,有時會縮短。 背後的想法是有一個通用函數,將試圖將項目轉換爲我告訴它的任何類型的列表。

+1

您能否提供更多信息?這些字符串代表什麼?他們是不是名字?它是從T型序列化的信息? – Nick 2010-03-05 18:53:07

+2

字符串將如何轉換爲T型? 您的函數需要獲取Converter(String,T)或Converter(String(),T())來進行轉換。 – 2010-03-05 18:55:13

回答

7

您需要提供一個字符串轉換到T的方法,你可以使用Func<string, T>做到這一點例如

List<int> ints = GetMyList(new[] { "1", "2", "3" }, s => int.Parse(s)); 
+0

List.ConvertAll而不是寫一個新的函數?例如。 string [] itemArray = {「1」,「2」}; (itemArray.ToList())。ConvertAll((x)=> int.Parse(x)); – 2010-03-05 19:30:39

0

這不起作用,因爲系統不知道如何將字符串轉換爲泛型T.即使已知它也不行,因爲C#(在4之前)沒有類型協方差。

public static List<T> GetMyList<T>(string[] itemList, Func<string, T> conversionFunc) 
{ 
    return itemList.Select(conversionFunc).ToList(); 
} 

: - 所以請使用的foreach複製,並通過一個轉換元件的一個或使用選擇的LINQ

+0

btw協方差適用於數組。但只有當CLR可以轉換元素itseld時,無需轉換方法 – Andrey 2010-03-05 18:56:25

1

我的第一個想法是,這不會工作,因爲不是每個對象類型都可以從一個字符串構造。也許你想用的東西更像是一個簽名:

 
public static List<T> GetMyList<T>(T[] itemList) 
{ 
    List resultList = new List(itemList.Length); 
    foreach (t in itemList) 
    { 
    resultList.add(t); 
    } 
    return resultList; 
} 

(。原諒我的語法我沒有編譯器方便,現在要檢查它)

0

類似Lee's但更通用的...

public static class Tools 
{ 
    public static List<TResult> ToList<T, TResult>(
     this IEnumerable<T> input, 
      Func<T, TResult> conversion) 
    { 
     return input.Select(conversion).ToList(); 
    } 
    public static List<TResult> ToList<T, TResult>(
     this IEnumerable<T> input, 
      Func<T, int, TResult> conversion) 
    { 
     return input.Select(conversion).ToList(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var input = new[] { "1", "2", "3" }; 

     var ret = input.ToList(i => int.Parse(i)); 
     // 1,2,3 

     var ret2 = input.ToList((i,j) => int.Parse(i) + j * 10); 
     // 1,12,23 
    } 
} 
+0

我有點驚訝,.ToList ()的重載與上面的簽名不符。 – 2010-03-05 19:21:58

1

稍微更優雅的解決辦法是增加一個擴展方法來字符串自動調用用於類型T解析器,像這樣:

public static class GenericParser { 
    public static T Parse<T>(this string input) { 
     var converter = TypeDescriptor.GetConverter(typeof(T)); 
     if (converter != null) { 
      return (T)converter.ConvertFromString(input); 
     } 
     return default(T); 
    } 
}  

然後,您的轉換函數看起來是這樣的:

public static List<T> GetMyList<T>(string[] itemList) { 
    List<T> list = new List<T>(); 
    list.AddRange(Array.ConvertAll<string, T>(itemList, delegate(string s) { 
     return s.Parse<T>(); 
    })); 
    return list; 
} 

而且用法是:

List<int> integers = GetMyList<int>(new []{"1", "2", "3", "4"}); 
List<double> doubles = GetMyList<double>(new []{"1.0", "2.0", "3.0", "4.0"}); 

等。

相關問題