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

求可完全移除重复行的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:57:34