如果必须在代码中的许多地方执行此操作,则可以创建一个奇特的扩展方法:
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#可以通过稍微更改扩展方法以使用“跨度”来避免这种情况:
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 staticIEnumerable<ReadOnlyMemory<char>>并通过调用
Slice未分配的源来创建子字符串。
请注意,如果你在某些时候必须转换
ReadOnlyMemory<char>到
string使用的API在一个新的字符串已被分配。幸运的是,
ReadOnlyMemory<char>除此以外,还有许多.NET
Core API可以使用,
string因此可以避免分配。



