拆分泛型类型的字符串扩展?

Bas*_*sem 1 .net c# extension-methods type-conversion c#-4.0

我想创建一个Split扩展,允许我将任何字符串拆分为强类型列表.我有一个良好的开端,但由于我将在许多项目中重复使用它,我希望从社区获得输入(因此您可以将其添加到您自己的工具箱中;)来自这里的任何想法?

public static class Converters
{
    public static IEnumerable<T> Split<T>(this string source, char delimiter)
    {
        var type = typeof(T);

        //SPLIT TO INTEGER LIST
        if (type == typeof(int))
        {
            return source.Split(delimiter).Select(n => int.Parse(n)) as IEnumerable<T>;
        }

        //SPLIT TO FLOAT LIST
        if (type == typeof(float))
        {
            return source.Split(delimiter).Select(n => float.Parse(n)) as IEnumerable<T>;
        }

        //SPLIT TO DOUBLE LIST
        if (type == typeof(double))
        {
            return source.Split(delimiter).Select(n => double.Parse(n)) as IEnumerable<T>;
        }

        //SPLIT TO DECIMAL LIST
        if (type == typeof(decimal))
        {
            return source.Split(delimiter).Select(n => decimal.Parse(n)) as IEnumerable<T>;
        }

        //SPLIT TO DATE LIST
        if (type == typeof(DateTime))
        {
            return source.Split(delimiter).Select(n => DateTime.Parse(n)) as IEnumerable<T>;
        }

        //USE DEFAULT SPLIT IF NO SPECIAL CASE DEFINED
        return source.Split(delimiter) as IEnumerable<T>;
    }
}
Run Code Online (Sandbox Code Playgroud)

Lee*_*Lee 9

我为转换函数添加了一个参数:

public static IEnumerable<T> Split<T>(this string source, Func<string, T> converter, params char[] delimiters)
{
    return source.Split(delimiters).Select(converter);
}
Run Code Online (Sandbox Code Playgroud)

你可以称之为

IEnumerable<int> ints = "1,2,3".Split<int>(int.Parse, ',');
Run Code Online (Sandbox Code Playgroud)

我还会考虑重命名它以避免与String.Split实例方法混淆,因为这会使重载分辨率变得复杂,并且与其他方法的行为不同.

编辑:如果您不想指定转换函数,您可以使用类型转换器:

public static IEnumerable<T> SplitConvert<T>(this string str, params char[] delimiters)
{
    var converter = TypeDescriptor.GetConverter(typeof(T));
    if (converter.CanConvertFrom(typeof(string)))
    {
        return str.Split(delimiters).Select(s => (T)converter.ConvertFromString(s));
    }
    else throw new InvalidOperationException("Cannot convert type");
}
Run Code Online (Sandbox Code Playgroud)

这允许转换扩展到其他类型,而不是依赖于预定义的列表.


Dou*_*las 5

虽然我同意Lee的建议,但我个人认为不值得为一些可能通过标准LINQ操作实现的东西定义新的扩展方法:

IEnumerable<int> ints = "1,2,3".Split(',').Select(int.Parse);
Run Code Online (Sandbox Code Playgroud)