我们经常需要将带有某些字符的值的字符串转换为列表。我想编写一个通用扩展方法,将字符串转换为指定类型的列表。以下是我到目前为止的情况:
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();
}
但是我收到了错误。
无法将类型'string'转换为'T'类型。
有没有更好的方法来执行此操作,还是需要为不同类型的列表创建多个扩展方法并执行Convert.ToInt32()
等?
我正在尝试做这样的事情:
var someStr = "123,4,56,78,100";
List<int> intList = someStr.ToDelimitedList<int>(",");
或
var someStr = "true;false;true;true;false";
List<bool> boolList = someStr.ToDelimitedList<bool>(";");
答案 0 :(得分:17)
Convert.ChangeType
适用于原始和许多框架类型(假设默认解析规则足够好):
return output.Select(x => (T) Convert.ChangeType(x, typeof(T)))
.ToList();
如果您需要这个适用于您自己的自定义类型,则必须让它们实现IConvertible
界面。
请记住,这不够复杂,无法使用自定义转换规则或足够强大以正确处理故障(除了抛出异常并使整个操作失败)。如果您需要支持,请提供一个接受TypeConverter
或转换委托的重载(如mike z的答案)。
答案 1 :(得分: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();
}
答案 2 :(得分:6)
好像你可以使用String.Split
和Enumerable.Select
?
var list = "1,2,3".Split(",").Select(s => int.Parse(s));
但如果你必须进行扩展,试试这个......
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));
答案 3 :(得分:6)
这对LINQ来说不是一个完美的任务吗?
您可以执行以下操作:
"1,2,3,4,5".Split(',').Select(s => Convert.ToInt32(s)).ToList();
您可以根据自己的情况更改通用 Select()
代表。