You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更高效地将逗号分隔字符串每10个元素分组?

优化逗号分隔字符串的分段实现

我正在寻找更高效简洁的方法,将逗号分隔的字符串按每10个元素分段。示例字符串如下:
31,139,8,0,0,0,0,0,4,0,164,188,233,139,121,45,100,253,235,255,225,212,147,233,105,231,15

当前实现代码

List<string> valueList = "31,139,8,0,0,0,0,0,4,0,164,188,233,139,121,45,100,253,235,255,225,212,147,233,105,231,15".Split(',').ToList();
List<string> groupedBy10 = new List<string>();

while (valueList.Any()) {
    groupedBy10.Add(string.Join(",", valueList.Take(10)) + ",");
    valueList = valueList.Skip(10).ToList();
}

groupedBy10[groupedBy10.Count - 1] = groupedBy10[groupedBy10.Count - 1].TrimEnd(',');
string newOutput = string.Join(Environment.NewLine, groupedBy10.ToArray());

当前输出结果

31,139,8,0,0,0,0,0,4,0,
164,188,233,139,121,45,100,253,235,255,
225,212,147,233,105,231,15

想了解有没有更简洁高效的实现方式,比如用Regex或LINQ?


几种优化方案

1. LINQ分组实现(简洁高效)

利用LINQ的索引分组,一次性完成分段和拼接,避免多次创建List和手动修正末尾逗号:

var input = "31,139,8,0,0,0,0,0,4,0,164,188,233,139,121,45,100,253,235,255,225,212,147,233,105,231,15";
var values = input.Split(',');
var groupedLines = values
    .Select((val, idx) => new { Value = val, GroupIndex = idx / 10 })
    .GroupBy(item => item.GroupIndex)
    .Select(group => 
        string.Join(",", group.Select(item => item.Value)) + 
        (group.Count() == 10 ? "," : "")
    );
var newOutput = string.Join(Environment.NewLine, groupedLines);

这种方式逻辑连贯,性能优于原循环的Skip/Take(减少多次枚举和List实例化)。

2. 正则表达式直接处理(减少中间操作)

无需拆分字符串,直接用正则匹配每10个元素的组合,减少中间对象创建:

var input = "31,139,8,0,0,0,0,0,4,0,164,188,233,139,121,45,100,253,235,255,225,212,147,233,105,231,15";
// 匹配10个元素的模式:9个"元素+逗号" + 1个元素,后面跟逗号或字符串结尾
var pattern = @"((?:[^,]*,){9}[^,]+)(?:,|$)";
var matches = Regex.Matches(input, pattern);
var lines = matches
    .Cast<Match>()
    .Select(match => match.Value.EndsWith(",") ? match.Value : match.Value + ",")
    .ToList();

var newOutput = string.Join(Environment.NewLine, lines);

正则直接操作原字符串,省去拆分再拼接的步骤,适合处理较长的字符串。

3. 优化循环写法(减少内存开销)

如果偏好循环,可通过索引遍历避免修改原List,降低内存消耗:

var input = "31,139,8,0,0,0,0,0,4,0,164,188,233,139,121,45,100,253,235,255,225,212,147,233,105,231,15";
var values = input.Split(',');
var groupedBy10 = new List<string>();
int currentIndex = 0;
int totalCount = values.Length;

while (currentIndex < totalCount)
{
    int takeCount = Math.Min(10, totalCount - currentIndex);
    var segment = string.Join(",", values.Skip(currentIndex).Take(takeCount));
    groupedBy10.Add(takeCount == 10 ? segment + "," : segment);
    currentIndex += takeCount;
}

var newOutput = string.Join(Environment.NewLine, groupedBy10);

这种写法保留了循环的直观性,同时避免了原代码中每次Skip后创建新List的操作。


内容的提问来源于stack exchange,提问作者StealthRT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:23:22