Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写将分隔字符串转换为列表的通用扩展方法?_C#_.net_Linq_List_Type Conversion - Fatal编程技术网

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();
}