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

时间:2010-03-05 18:50:34

标签: c# .net generics

我想创建一个函数,它将返回我在运行时指定的类型列表。 我沿着这条路尝试了一些东西:

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

但这不起作用。显然我不完全了解如何传递要转换的类型。 任何帮助将不胜感激。

编辑: 它看起来不可能,但这里有更多信息。字符串数组将包含数字,我想将这些数字有时转换为int,有时转换为short。 背后的想法是拥有一个通用函数,它将尝试将项目转换为我告诉它的任何类型列表。

5 个答案:

答案 0 :(得分:7)

您需要提供一种将字符串转换为T的方法 - 您可以使用Func<string, T>执行此操作:

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

e.g。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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"});

等等。

答案 3 :(得分:0)

这不起作用,因为系统不知道如何将字符串转换为泛型T.即使它已知,它也不起作用,因为C#(在4之前)没有类型协方差。因此,使用foreach逐个复制和转换元素或使用Linq中的Select

答案 4 :(得分: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
    }
}