为什么string.Split(';')有效,但string.Split(':',StringSplitOptions.RemoveEmptyEntries)不是?

时间:2015-10-14 11:08:55

标签: c# .net .net-4.0

我很困惑哪个重载string.Split(';')正在解决;我认为';'不是char数组吗?

但是,这是正常编译,但如果我尝试添加第二个StringSplitOptions参数,则找不到合适的重载。

我不喜欢这样做new char []{';'}是否可以避免?

2 个答案:

答案 0 :(得分:10)

String.Split() first overload的参数定义为

  

参数 char []分隔符

这意味着您可以传递任意数量的char参数,它将起作用:

someString.Split('1', '2', '3');
// or just one separator
someString.Split(';');

second overload不同,它定义了像这样的参数

  

char [] separator,StringSplitOptions选项

注意,没有params。这需要您传递char[]参数:

someString.Split(new[] {'1', '2', '3'}, StringSplitOptions.None);
// or just one separator
someString.Split(new[] {';'}, StringSplitOptions.None);

答案 1 :(得分:1)

在第一种情况下,您使用的是此方法:

public string[] Split(params char[] separator)

在第二种情况下:

public string[] Split(char[] separator, StringSplitOptions options)

正如您所看到的,第二种情况下的声明略有不同,因此您无法以这种方式传递参数。

如果您想以类似的方式使用此方法,您可以编写自己的扩展方法:

public static class StringExtensions
{
    public static string[] Split(this string s, char separator, StringSplitOptions options)
    {
        return s.Split(new[] { separator }, options);
    }

//or

    public static string[] Split(this string s, StringSplitOptions options, params char[] separator)
    {
        return s.Split(separator, options);
    }
}

并使用它们如下:

        var s = "asdasd;asd;;";
        var split = s.Split(StringSplitOptions.RemoveEmptyEntries, ';');
        var split2 = s.Split(StringSplitOptions.RemoveEmptyEntries, ';', ',');
        var split3 = s.Split(';', StringSplitOptions.RemoveEmptyEntries);

我建议你阅读更多有关这些元素的内容:

  1. string.Split()
  2. params keyword
  3. params关键字解释:link
  4. @Groo params关键字解释:

      

    params的文档实际上并没有解释阵列创建的方式/时间,因此可能会让人感到困惑。问题是params只是对编译器的一个提示,允许您传递由逗号分隔的数组项,而不显式实例化数组。但是,无论您是传递0,1还是多个参数,都会在每次调用Split方法时创建包含参数的新数组。此外,您仍然可以自己创建一个数组并将其传递给该方法,但这可以让编译器为您完成。