如果您必须在代码中的许多地方这样做,您可以创建一个精美的扩展方法:
static class StringExtensions {
public static IEnumerable<String> SplitInParts(this String s, Int32 partLength) {
if (s == null)
throw new ArgumentNullException(nameof(s));
if (partLength <= 0)
throw new ArgumentException("Part length has to be positive.", nameof(partLength));
for (var i = 0; i < s.Length; i += partLength)
yield return s.Substring(i, Math.Min(partLength, s.Length - i));
}
}
然后你可以像这样使用它:
var parts = "32427237".SplitInParts(3);
Console.WriteLine(String.Join(" ", parts));
根据需要输出324 272 37。
当您将字符串拆分为多个部分时,即使这些子字符串已经存在于原始字符串中,也会分配新字符串。通常,您不必太在意这些分配,但使用现代 C# 您可以通过稍微改变扩展方法以使用“spans”来避免这种情况:
public static IEnumerable<ReadOnlyMemory<char>> SplitInParts(this String s, Int32 partLength)
{
if (s == null)
throw new ArgumentNullException(nameof(s));
if (partLength <= 0)
throw new ArgumentException("Part length has to be positive.", nameof(partLength));
for (var i = 0; i < s.Length; i += partLength)
yield return s.AsMemory().Slice(i, Math.Min(partLength, s.Length - i));
}
返回类型更改为public static IEnumerable<ReadOnlyMemory<char>>,并通过在未分配的源上调用Slice 创建子字符串。
请注意,如果您在某些时候必须将 ReadOnlyMemory<char> 转换为 string 以在 API 中使用,则必须分配一个新字符串。幸运的是,除了string,还有很多.NET Core API 使用ReadOnlyMemory<char>,所以可以避免分配。