如何在分隔字符串的第一个元素上找到部分重复项?

How do I find partial duplicate on first element of a delimited string?

我有一个竖线分隔的文本文件,我将其读入字符串数组。文本文件将有 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() 查找 entire 行的重复值,但我不确定如何仅使用字符串数组的第一个元素来执行此操作。我会提供一些我尝试的代码,但老实说,我什至不知道如何开始实现预期的结果。任何帮助表示赞赏!谢谢

(如果此 post 重复,我深表歉意。我不得不刷新页面。)

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

这里有一个也许可以帮助您入门的快速方法:

Dictionary<string,List<string>> unDupe = new Dictionary<string, List<string>>();

for (int i = 0; i < yourArray.Length; i++)
{
    string[] split = yourArray[i].Split('|');
    if (unDupe.ContainsKey(split[0]))
    {
        unDupe[split[0]].Add(split[1]);
    }
    else
    {
        unDupe.Add(split[0], new List<string>() { split[1] });
    }
}

List<string> undupinated = new List<string>();

foreach (var keyValuePair in unDupe)
{
    undupinated.Add(string.Concat(keyValuePair.Key, "|", string.Join("~", keyValuePair.Value)));
}

举例来说,您已将输入文件的行解析为具有 Key(例如 ABC)和 Value(例如 111)的可枚举对象列表,您可以模拟[使用一些 LINQ GroupBy 做你想做的事:

 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);