首页 > 解决方案 > 如何在分隔字符串的第一个元素上找到部分重复项?

问题描述

我有一个以管道分隔的文本文件,我将其读入字符串数组。文本文件将有 2 个元素,第一个元素可能有一个或多个重复项。如果有任何重复,我想将这些值连接成 1。

示例文本文件:

ABC|111
DEF|222
GHI|333
ABC|444
JKL|555
ABC|666

在本例中,“ABC”重复了 3 次。我想将这些值连接成一行,用“~”号分隔。

新的字符串数组值:

ABC|111~444~666
DEF|222
GHI|333
JKL|555

列表的顺序并不重要。我知道如何使用 .Distinct() 查找行的重复值,但我不确定如何仅使用字符串数组的第一个元素来执行此操作。我会提供一些我尝试的代码,但老实说,我什至不知道如何开始达到预期的结果。任何帮助表示赞赏!谢谢。

(抱歉,如果这篇文章重复了。我不得不刷新页面。)

编辑 文本文件可以包含 10,000 - 100,000 个值。

标签: c#arrayssplitduplicatespartial

解决方案


例如,假设您已将输入文件的行解析为具有Key(例如 ABC)和Value(例如 111)的可枚举对象列表,您可以 sim[ply 使用一些 LINQGroupBy来做您想做的事情:

 var result = table.GroupBy(x => x.Key, v => v.Value)
                   .Select( g => g.Key + "|" + String.Join("~",g));

table您的可枚举列表在哪里。

实时工作代码:https ://rextester.com/HGP1385


var input = @"ABC|111
DEF|222
GHI|333
ABC|444
JKL|555
ABC|666";

var table = input.Split(new[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries)
    .Select(x => {
      var values = x.Split('|');
        return new { Key = values[0], Value = values[1] };
    });

var result = table.GroupBy(x => x.Key, v => v.Value)
                  .Select( g => g.Key + "|" + String.Join("~",g));

foreach(var r in result)
    Console.WriteLine(r);

推荐阅读