求可完全移除重复行的C#/VB.NET代码(适用于字符串/列表/RichTextBox)
彻底移除重复项(完全删除所有出现过多次的元素)解决方案
看起来你需要的不是普通的「去重保留首次出现」,而是彻底移除所有重复出现过的元素——也就是只要某个内容出现超过一次,不管出现几次,都全部删掉,只保留仅出现一次的项。你的示例里"asd"出现两次,所以都被移除,剩下只出现一次的"djsdjjd"和"252",这和你之前用的Distinct逻辑完全不同,那我来给你针对性的解决方案:
VB.NET 实现
1. 处理 List(Of String)
通过GroupBy统计每个元素的出现次数,筛选仅出现一次的项:
Dim originalList As New List(Of String) From {"asd", "asd", "djsdjjd", "252"} ' 分组统计次数,筛选仅出现一次的元素 Dim uniqueItems = originalList.GroupBy(Function(item) item) .Where(Function(group) group.Count() = 1) .Select(Function(group) group.Key) .ToList() ' 此时 uniqueItems 为 {"djsdjjd", "252"}
2. 处理 RichTextBox
直接针对RichTextBox的行数据进行处理,逻辑和列表一致:
' 获取RichTextBox的行数据 Dim linesList As New List(Of String)(RichTextBox1.Lines) ' 筛选仅出现一次的行(可选Trim()消除空格影响,根据你的需求调整) Dim filteredLines = linesList.GroupBy(Function(line) line.Trim()) .Where(Function(g) g.Count() = 1) .Select(Function(g) g.Key) .ToArray() ' 赋值回RichTextBox RichTextBox1.Lines = filteredLines ' 计算移除的重复项总数 Dim removedCount = linesList.Count - filteredLines.Length MessageBox.Show($"移除了 {removedCount} 个重复项(所有出现多次的项已彻底删除)")
3. 处理空格分隔的字符串
针对你示例中的输入格式,先拆分再筛选:
Dim inputStr As String = "asd asd djsdjjd 252" ' 拆分字符串(自动忽略空项) Dim splitItems = inputStr.Split({" "}, StringSplitOptions.RemoveEmptyEntries) ' 筛选仅出现一次的元素并重组字符串 Dim filteredItems = splitItems.GroupBy(Function(item) item) .Where(Function(g) g.Count() = 1) .Select(Function(g) g.Key) Dim resultStr = String.Join(" ", filteredItems) ' resultStr 结果为 "djsdjjd 252"
C# 实现
1. 处理 List
List<string> originalList = new List<string> { "asd", "asd", "djsdjjd", "252" }; var uniqueItems = originalList.GroupBy(item => item) .Where(group => group.Count() == 1) .Select(group => group.Key) .ToList();
2. 处理 RichTextBox
// 获取RichTextBox的行数据 List<string> linesList = new List<string>(richTextBox1.Lines); // 筛选仅出现一次的行 var filteredLines = linesList.GroupBy(line => line.Trim()) .Where(g => g.Count() == 1) .Select(g => g.Key) .ToArray(); // 赋值回RichTextBox richTextBox1.Lines = filteredLines; // 计算移除数量 int removedCount = linesList.Count - filteredLines.Length; MessageBox.Show($"移除了 {removedCount} 个重复项(所有出现多次的项已彻底删除)");
3. 处理空格分隔的字符串
string inputStr = "asd asd djsdjjd 252"; var splitItems = inputStr.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); var filteredItems = splitItems.GroupBy(item => item) .Where(g => g.Count() == 1) .Select(g => g.Key); string resultStr = string.Join(" ", filteredItems); // resultStr 结果为 "djsdjjd 252"
为什么你之前的代码没生效?
- 代码1:
Distinct的逻辑是保留每个元素的首次出现,所以会留下第一个"asd",不符合你要彻底删除所有重复项的需求。 - 代码2:仅处理相邻的重复项,而且删除后直接退出循环,逻辑不完整,无法处理非相邻的重复情况。
内容的提问来源于stack exchange,提问作者user14074797
相关产品推荐
相关产品推荐

