处理繁琐的字符串.拆分重载

本文关键字:拆分 重载 字符串 处理 | 更新日期: 2023-09-27 17:57:13

字符串。.NET 中的 Split() 使用起来可能很麻烦。 对于许多重载,即使传递单个分隔符,也必须指定一个数组(实际上只有一个重载用参数标记)。

有没有这样的选择?有没有办法在不创建数组的情况下完成任务。

处理繁琐的字符串.拆分重载

问题是在开发这样的 API 时有两种相互冲突的最佳实践(它们都是好的做法,通常不会冲突,除非在这种特殊情况下):

  • 只有params参数可以/必须显示为最后一个参数。
  • 函数的重载保持相同的参数顺序。

所以你有第一个重载:

Split(params char[] separator)

它利用了 params 关键字,这样您就不需要显式创建数组,因为它是隐式完成的。

其他重载遵循第二个准则,将separator参数保留为第一个参数,但因此无法指定 params 关键字,因为它只能出现在最后一个参数上。

因此,这是在两种最佳实践之间取得平衡的设计选择。 在这种情况下,他们遵循维护参数顺序准则,并且没有在其他重载上使用 params 关键字,因为当它后面跟着其他参数时是不允许的。

溶液

您可以实现自己的静态方法或扩展,其中 separator 参数始终是最后一个参数,因此始终可以使用它指定params。 基本上,您可以决定支持第一个准则而忽略第二个准则:

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

在对类库和不断发展的 API 进行版本控制时必须小心。 在某些情况下,引入新的params重载将允许它不明确地匹配旧的重载,并破坏使用它的项目的代码。

另类

如果你想避免编写重载扩展,正如 Craig W. 指出的那样"x".ToCharArray()这可能是生成单个项目数组(甚至"xyz".ToCharArray()多个单字符分隔符)的更直观的方法。 应该注意,这意味着您正在添加一些额外的运行时处理,但它可能太小了,可以忽略不计。

您可以创建一个具有可选参数的(扩展)方法。

public static string[] SplitDelimiter(this string str, char delimiter, int count = 0, StringSplitOptions options = StringSplitOptions.None)
{
    int toCount = count == 0 ? count = str.Length : toCount = count;
    return str.Split(new[] { delimiter }, toCount, options);
}

然后,您可以在不显式创建数组的情况下使用它。

string myString = "1,2,3";
Console.WriteLine(myString.SplitDelimiter(',').Count()); //returns 3