C# 如何编写将分隔字符串转换为列表的通用扩展方法?
我们经常需要将一个字符串(其值由某个字符分隔)转换为一个列表。我想编写一个泛型扩展方法,将字符串转换为指定类型的列表。以下是我到目前为止的情况:C# 如何编写将分隔字符串转换为列表的通用扩展方法?,c#,.net,linq,list,type-conversion,C#,.net,Linq,List,Type Conversion,我们经常需要将一个字符串(其值由某个字符分隔)转换为一个列表。我想编写一个泛型扩展方法,将字符串转换为指定类型的列表。以下是我到目前为止的情况: public static List<T> ToDelimitedList<T>(this string value, string delimiter) { if (value == null) { return new List<T>();
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();
}
或
var someStr=“真;假;真;真;假”;
List boolList=someStr.ToDelimitedList(“;”);
似乎您可以只使用String.Split
和可枚举。选择
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));
公共静态列表ParseDelimitedList(此字符串值、字符串分隔符、Func选择器)
{
如果(值==null)
{
返回新列表();
}
var output=value.Split(新字符串[]{delimiter},StringSplitOptions.RemoveEmptyEntries);
返回output.Select(选择器).ToList();
}
var list=“1,2,3”.ParseDelimitedList(“,”,s=>int.Parse(s));
这对LINQ来说不是一个完美的任务吗
您可以执行以下操作:
"1,2,3,4,5".Split(',').Select(s => Convert.ToInt32(s)).ToList();
您可以根据您的情况更改泛型Select()
委托。将适用于基本类型和许多框架类型(假设默认解析规则足够好):
如果您需要它来处理您自己的自定义类型,则必须让它们实现接口
请记住,这不够复杂,无法使用自定义转换规则,也不够健壮,无法正确处理故障(除了抛出异常并使整个操作失败之外)。如果您需要对此提供支持,请提供一个接受或转换委托的重载(如mike z的回答所示)。没有内置方法将字符串转换为任意类型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();
}
公共静态列表ToDelimitedList(此字符串值、字符串分隔符、Func转换器)
{
如果(值==null)
{
返回新列表();
}
var output=value.Split(新字符串[]{delimiter},StringSplitOptions.RemoveEmptyEntries);
返回输出.Select(converter.ToList();
}
当唯一涉及的类型是字符串时,为什么使用泛型方法?需要将字符串转换为不同的类型。字符串中的值可以是1,2,3,4,5
或true、false、false、true
。您必须为此做一些编码!您必须返回列表吗?为什么不让我数一数呢?这样你就可以得到懒惰评估了。这不是一般性的。它只会返回int
。比我快@AlexFord,它不需要是通用的,因为Select语句将允许您提供通用转换。很好,但他可能只是想要一个通用解决方案?@luis_laurent这是一个通用解决方案。不要再发明轮子了。没有理由将Split
和Select
组合为一个操作。单独调用这两个方法。啊,我明白你的意思。根本不使用扩展。+1,wow从来都不知道有像Convert.ChangeType
这样的东西,虽然我正在考虑像Oliver和p.s.w.g建议的那样使用直接linq。我接受这一点,因为这是我所问问题的答案,但正如安尼所提到的,它是变化无常的,而且在@Oliver的回答中使用直截了当的LINQ可能更好。
"1,2,3,4,5".Split(',').Select(s => Convert.ToInt32(s)).ToList();
return output.Select(x => (T) Convert.ChangeType(x, typeof(T)))
.ToList();
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();
}