您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

每N个字符/数字分割一个字符串/数字?

每N个字符/数字分割一个字符串/数字?

如果必须在代码中的许多地方执行此操作,则可以创建一个奇特的扩展方法

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在一个新的字符串已被分配。幸运的是,ReadOnlyMemory<char>除此以外,还有许多.NET Core API可以使用,string因此可以避免分配。

其他 2022/1/1 18:16:18 有436人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶