处理繁琐的字符串.拆分重载
本文关键字:拆分 重载 字符串 处理 | 更新日期: 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