【问题标题】:Why is string.Split(';') valid but string.Split(':',StringSplitOptions.RemoveEmptyEntries) is not?为什么 string.Split(';') 有效但 string.Split(':',StringSplitOptions.RemoveEmptyEntries) 无效?
【发布时间】:2016-01-12 10:43:25
【问题描述】:

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

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

我不喜欢做new char []{';'} 可以避免吗?

【问题讨论】:

  • 一个字符数组Split(params Char[] value)
  • 至少,你可以做到new[] { ';' }
  • @Mr.Boy:你读过documentation on params吗?
  • 由于params关键字,你可以.Split(';', ',', '-')。编译器将多个 args 变成一个数组
  • A params 参数也必须是签名中的 last 参数,并且在您想要拆分的实际内容之前传递 StringSplitOptions 会很奇怪允许您使用此签名创建重载。您当然可以构建自己的扩展方法,根据需要重新映射参数。

标签: c# .net .net-4.0


【解决方案1】:

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

参数 char[] 分隔符

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

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

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

char[] 分隔符,StringSplitOptions 选项

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

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

【讨论】:

  • 我可能在这里做错了,但我的编译器不喜欢new {';'} 示例。它想要new []{';'}
  • 这行得通...并且可能是 .net 框架中最愚蠢的方法调用。感谢您为我们解决这个问题!
【解决方案2】:

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

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

@Groo params 关键字解释:

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

【讨论】:

  • 谢谢。您是否会添加一些关于 params 在这里所做的事情的信息,以便为未来提供更完整的答案?简介很好:)
  • 我添加了链接,您可以在其中找到有关此元素的更多信息。我不会详细说明这个主题,因为它是一个简单的语言元素,具有适当的文档。
  • @Mr.Boy:params 的文档实际上并没有解释 如何/何时 创建数组,所以这可能是令人困惑的地方。问题是params 只是对编译器的提示,允许您传递以逗号分隔的数组项,而无需显式实例化数组。但是,每次调用 Split 方法时都会创建一个包含您的参数的新数组,无论您传递的是 0 个、1 个还是多个参数。此外,您仍然可以自己创建一个数组并将其传递给方法,但这会让编译器为您完成。
  • 如果@PawelMaga 想把它复制粘贴进去,那条评论将是对这个答案的极好补充!
猜你喜欢
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多