将字符串数组转换为列表的通用方法

将字符串数组转换为列表的通用方法

问题描述:

我想创建一个函数,它将返回在运行时由我指定的类型列表。我试过这条线:将字符串数组转换为列表的通用方法

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

您需要提供一个字符串转换到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

这不起作用,因为系统不知道如何将字符串转换为泛型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

我的第一个想法是,这不会工作,因为不是每个对象类型都可以从一个字符串构造。也许你想用的东西更像是一个签名:

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

(。原谅我的语法我没有编译器方便,现在要检查它)

类似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

稍微更优雅的解决办法是增加一个扩展方法来字符串自动调用用于类型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"}); 

等。