我需要将一个数字拆分为偶数部分,例如:
32427237 needs to become 324 272 37
103092501 needs to become 103 092 501
如何进行拆分并处理奇数情况,例如拆分导致这些部分,例如123 456 789 0?
我需要将一个数字拆分为偶数部分,例如:
32427237 needs to become 324 272 37
103092501 needs to become 103 092 501
如何进行拆分并处理奇数情况,例如拆分导致这些部分,例如123 456 789 0?
如果必须在代码中的许多地方这样做,可以创建一个奇特的扩展方法:
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 static IEnumerable<ReadOnlyMemory<char>>
,并通过对未分配的源调用Slice
来创建子字符串.
请注意,如果您在某个时刻必须将ReadOnlyMemory<char>
转换为string
以便在API中使用,则必须分配一个新字符串.幸运的是,有很多.NET核心API,除了string
之外还使用ReadOnlyMemory<char>
,因此可以避免分配.