【问题标题】:Is there String.Split() which takes StringComparison into account?是否存在考虑 StringComparison 的 String.Split() ?
【发布时间】:2015-09-22 10:54:12
【问题描述】:

Best Practices for Using Strings in the .NET Framework 中,我们鼓励在比较字符串时提供正确的StringComparison。我同意这一点,但我看到与其他方法不同,String.Split() 实际上没有带有比较参数的重载。

是否有相当于 String.Split() 在框架中某处进行字符串比较,还是我应该自己编写?

【问题讨论】:

  • 什么选项对String.Split 有意义?定界符通常没有有大小写。您可能会争辩说使用字母作为分隔符是一个错误。您发布的链接谈论比较,而不是拆分。如果您想要一种灵活的方式来解析字符串,最好使用可以匹配特定大小写、重音符号和字符类的正则表达式。
  • 已记录使用Ordinal 比较。显然,开发人员认为这是唯一对Split() 这样的方法有意义的方法。考虑到分隔符列表是char[],这可能是唯一有意义的。 string[] 分隔符可能遵循相同的一致性规则。

标签: .net string unicode equality case-sensitive


【解决方案1】:

是否有相当于String.Split() 在框架中的某处进行字符串比较?

没有。那没有。坦率地说,我认为这没有多大意义。如果您在特殊字符上拆分字符串,通常是因为另一个系统向您提供了原始字符串,您为什么要在 Xx 上拆分?通常你不想这样做,而且 .NET 不提供帮助你的方法。

我应该自己写吗?

嗯,你可以帮点忙。这是一个不区分大小写的拆分器。它仍然需要一些工作,但您可以将其作为起点:

public static string[] Split(string s, params char[] delimeter)
{
    List<string> parts = new List<string>();

    int lastPartIndex = 0;
    for (int i = 0; i < s.Length; i++)
    {
        if (delimeter.Select(x => char.ToUpperInvariant(x)).Contains(char.ToUpperInvariant(s[i])))
        {
            parts.Add(s.Substring(lastPartIndex, i - lastPartIndex));

            lastPartIndex = i + 1;
        }
    }

    if (lastPartIndex < s.Length)
    {
        parts.Add(s.Substring(lastPartIndex, s.Length - lastPartIndex));
    }

    return parts.ToArray();
}

【讨论】:

  • 意外发现Regex.Split已经提供了需要的功能。
  • 感谢您的明确No. There is not.。也感谢您为指明方向所做的努力。就我个人而言,我可能会选择IndexOf() 而没有 Linq。但也许有些读者会对上述方法感到满意。
【解决方案2】:

最接近的是Regex.Split。它可以忽略大小写和文化。 示例:Regex.Split("FirstStopSecondSTOPThird", "stop", RegexOptions.IgnoreCase)

将导致:

First
Second
Thrid

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 2016-10-17
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2020-05-03
    相关资源
    最近更新 更多