如何编写用于将分隔字符串转换为列表的通用扩展方法?

Che*_*hev 9 .net c# linq list type-conversion

我们经常需要将带有由某个字符分隔的值的字符串转换为列表.我想编写一个通用扩展方法,将字符串转换为指定类型的列表.这是我到目前为止:

    public static List<T> ToDelimitedList<T>(this string value, string delimiter)
    {
        if (value == null)
        {
            return new List<T>();
        }

        var output = value.Split(new string[] { delimiter }, StringSplitOptions.RemoveEmptyEntries);
        return output.Select(x => (T)x).ToList();
    }
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误.

无法将类型'string'转换为'T'类型.

有没有更好的方法来做到这一点,还是我需要为不同类型的列表创建多个扩展方法Convert.ToInt32(),等等?

UPDATE

我正在尝试做这样的事情:

var someStr = "123,4,56,78,100";
List<int> intList = someStr.ToDelimitedList<int>(",");
Run Code Online (Sandbox Code Playgroud)

要么

var someStr = "true;false;true;true;false";
List<bool> boolList = someStr.ToDelimitedList<bool>(";");
Run Code Online (Sandbox Code Playgroud)

Ani*_*Ani 17

Convert.ChangeType 将适用于原始和许多框架类型(假设默认解析规则足够好):

return output.Select(x => (T) Convert.ChangeType(x, typeof(T)))
             .ToList();
Run Code Online (Sandbox Code Playgroud)

如果您需要它来为您自己的自定义类型工作,您必须让它们实现该IConvertible接口.

请记住,这不够复杂,无法使用自定义转换规则或足够强大以正确处理故障(除了抛出异常并使整个操作失败).如果您需要支持,请提供接受TypeConverter转换委托的重载(如mike z的答案).

  • +1,哇从来不知道有类似`Convert.ChangeType`的东西 (3认同)

Mik*_*ray 9

没有内置的方法将字符串转换为任意类型T.你的方法必须采取某种代表:

public static List<T> ToDelimitedList<T>(this string value, string delimiter, Func<string, T> converter)
{
    if (value == null)
    {
        return new List<T>();
    }

    var output = value.Split(new string[] { delimiter }, StringSplitOptions.RemoveEmptyEntries);
    return output.Select(converter).ToList();
}
Run Code Online (Sandbox Code Playgroud)


p.s*_*w.g 6

好像你可以使用String.SplitEnumerable.Select

var list = "1,2,3".Split(",").Select(s => int.Parse(s));
Run Code Online (Sandbox Code Playgroud)

但如果你必须进行扩展,试试这个......

public static List<T> ParseDelimitedList<T>(this string value, string delimiter, Func<string, T> selector)
{
    if (value == null)
    {
        return new List<T>();
    }

    var output = value.Split(new string[] { delimiter }, StringSplitOptions.RemoveEmptyEntries);
    return output.Select(selector).ToList();
}

var list = "1,2,3".ParseDelimitedList(",", s => int.Parse(s));
Run Code Online (Sandbox Code Playgroud)

  • @luis_laurent这是一个通用的解决方案.不要重新发明轮子.没有理由将"Split"和"Select"组合成一个操作.只需单独调用这两种方法即可. (4认同)

Oli*_*ver 6

这对LINQ来说不是一个完美的任务吗?

您可以执行以下操作:

"1,2,3,4,5".Split(',').Select(s => Convert.ToInt32(s)).ToList();
Run Code Online (Sandbox Code Playgroud)

您可以根据您的具体情况更改通用 Select()委托.