如何移除List<string>中数字开头元素并分段拼接剩余字符串?
解决方案
先说说你原有代码的问题:
- C#里字符串是不可变类型,调用
s.Remove()只会生成新字符串,根本改不了原列表里的元素;而且foreach遍历集合时不能直接修改集合,强行改会报错。 String.Concat(s)只是单独处理当前字符串,没把多个单词累积起来,自然拼不出完整句子。
下面给两种靠谱的实现方式:
方法一:基础循环分组(逻辑清晰,易理解)
var list = new List<string> { "12345", "Words", "Are", "Here", "13264", "More", "Words", "15654", "Extra", "Words" }; // 存所有分组的容器 var groups = new List<List<string>>(); // 当前正在攒的分组 List<string> currentGroup = null; foreach (var item in list) { // 判断当前项是不是数字开头 if (char.IsDigit(item[0])) { // 如果之前有攒好的分组,先丢进groups,然后重置 if (currentGroup != null && currentGroup.Count > 0) { groups.Add(currentGroup); currentGroup = null; } } else { // 没分组就新建一个,把当前单词加进去 currentGroup ??= new List<string>(); currentGroup.Add(item); } } // 循环结束后,把最后一个没来得及加的分组也丢进去 if (currentGroup != null && currentGroup.Count > 0) { groups.Add(currentGroup); } // 输出结果,每个分组拼成句子 foreach (var group in groups) { var sentence = string.Join(" ", group); // 控制台直接打印就行,要是要HTML里的加粗效果,就用<strong>包裹 Console.WriteLine(sentence); // HTML版本:Console.WriteLine($"<strong>{sentence}</strong>"); }
方法二:LINQ简化写法(代码简洁,适合熟手)
var list = new List<string> { "12345", "Words", "Are", "Here", "13264", "More", "Words", "15654", "Extra", "Words" }; int groupIndex = 0; var resultLines = list.GroupBy(item => { if (char.IsDigit(item[0])) { groupIndex++; return groupIndex; } return groupIndex; }) // 过滤掉全是数字的分组 .Where(g => !g.All(item => char.IsDigit(item[0]))) // 把每组拼成句子 .Select(g => string.Join(" ", g)); // 输出每一行 foreach (var line in resultLines) { Console.WriteLine(line); // HTML加粗版:Console.WriteLine($"<strong>{line}</strong>"); }
重点提醒
- 用
char.IsDigit(item[0])判断数字开头,比只判断以"1"开头更通用,能处理所有0-9开头的情况。 - 要是需要示例里的加粗效果,在网页场景下用
<strong>标签包起来就行;控制台里可以用颜色设置模拟加粗(比如Console.ForegroundColor = ConsoleColor.White;)。
内容的提问来源于stack exchange,提问作者Jevon Coleman
相关产品推荐
相关产品推荐

