我需要将一个数字拆分为偶数部分,例如:

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>,因此可以避免分配.

.net相关问答推荐

Azure管道-使用.NET 8 RC2 SDK生成C#项目失败

如何在 .Net Core EF 中组合多个条件表达式来过滤数据?

无法使用 int.Parse 从字符串转换值

如何获得友好的操作系统版本名称?

编译时禁用 Dll 文化文件夹

Int32.ToString() 是特定于文化的吗?

您是否使用 TestInitialize 或测试类构造函数来准备每个测试?为什么?

无法加载文件或程序集WebGrease,版本=1.5.1.25624,Culture=neutral,PublicKeyToken=31bf3856ad364e35或其依赖项之一

基于多个字符分隔符拆分字符串

如何在 C# 7 中返回多个值?

.NET 的 String.Normalize 有什么作用?

析构函数、dispose 和 finalize 方法的区别

是否可以完全用托管的 .NET 语言编写 JIT 编译器(本地代码)

无法加载文件或程序集System.ValueTuple

如何在 nuspec 中指定特定的依赖版本?

忽略 LINQ to XML 中的命名空间

表单不响应 KeyDown 事件

C# ListView 列宽自动

从 bcp 客户端接收到 colid 6 的无效列长度

什么时候使用 Tuple 和 KeyValuePair 比较好?