如何更高效地将逗号分隔字符串每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
相关产品推荐
相关产品推荐

