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

如何移除C#中StringBuilder内容里的重复行?

解决StringBuilder中行重复的问题

核心思路

把StringBuilder的内容按行拆分,用有序集合去重,再重新构建回StringBuilder,全程不修改单词本身,也保留StringBuilder类型。

方案一:适合中小型词表

如果词表规模不大,直接拆分后去重:

// 假设你的StringBuilder对象叫sb
String content = sb.toString();
// 按所有换行符分割(兼容Windows/Linux/macOS的换行格式)
String[] lines = content.split("\\R");

// 用LinkedHashSet去重,同时保留原顺序(只保留第一次出现的行)
Set<String> uniqueLines = new LinkedHashSet<>(Arrays.asList(lines));

// 清空原StringBuilder,重新写入去重后的内容
sb.setLength(0);
for (String line : uniqueLines) {
    sb.append(line).append(System.lineSeparator());
}

// 移除最后一行多余的换行符(如果不需要可以省略)
if (sb.length() > 0) {
    sb.setLength(sb.length() - System.lineSeparator().length());
}

方案二:适合大型词表(低内存占用)

如果词表非常大,一次性拆分数组会占用过多内存,用逐行读取的方式处理:

// 假设你的StringBuilder对象叫sb
String content = sb.toString();
sb.setLength(0); // 先清空原内容

try (BufferedReader reader = new BufferedReader(new StringReader(content))) {
    String line;
    Set<String> seenLines = new LinkedHashSet<>();
    while ((line = reader.readLine()) != null) {
        // add方法返回true表示该行之前未出现过,才写入
        if (seenLines.add(line)) {
            sb.append(line).append(System.lineSeparator());
        }
    }
} catch (IOException e) {
    // 读取字符串不会抛出IO异常,这里仅做兜底
    e.printStackTrace();
}

// 移除最后多余的换行符(可选)
if (sb.length() > 0) {
    sb.setLength(sb.length() - System.lineSeparator().length());
}

关键说明

  • 用LinkedHashSet而不是普通HashSet:前者会保留行的原始顺序,只移除后续重复的行;后者会打乱顺序。
  • 不修改单词本身:整个过程只是判断行的重复,不会修改任何单词的内容。
  • 保留StringBuilder类型:最终操作的还是原StringBuilder对象(清空后重新写入),符合你的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:50:37