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)
我为转换函数添加了一个参数:
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)
这允许转换扩展到其他类型,而不是依赖于预定义的列表.
虽然我同意Lee的建议,但我个人认为不值得为一些可能通过标准LINQ操作实现的东西定义新的扩展方法:
IEnumerable<int> ints = "1,2,3".Split(',').Select(int.Parse);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1526 次 |
| 最近记录: |