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

Posted

技术标签:

【中文标题】如何在分隔字符串的第一个元素上找到部分重复项?【英文标题】:How do I find partial duplicate on first element of a delimited string? 【发布时间】:2019-09-01 02:33:58 【问题描述】:

我有一个以竖线分隔的文本文件,我将其读入字符串数组。文本文件将有 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 个值。

【问题讨论】:

您可以使用.Split() 在分隔符上拆分字符串,然后只比较字符串的一部分。建议您先熟悉一下 MSDN 文档,以便找到对您的情况有帮助的函数。 @Code-Apprentice 谢谢!我确实尝试使用.Split() 来拆分元素,但我不知道如何在使用第一个元素搜索重复项时保留第二个元素及其各自的第一个元素。 解决这样的编程问题通常意味着离开计算机并在将这些步骤转换为代码之前找出必要的步骤。我经常喜欢用笔和纸把这些用文字写出来。 【参考方案1】:

例如,假设您已将输入文件的行解析为具有 Key(例如 ABC)和 Value(例如 111)的可枚举对象列表,您可以模拟 [ply 使用一些 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);

【讨论】:

谢谢,@Jamiec。我去了 rextester.com 并看到了你的代码。它完美无缺。我还是 C# 新手,对 LINQ 还不太了解,所以这段代码对我来说是新的,但仍然非常有用。【参考方案2】:

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

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

【讨论】:

谢谢,@SharpNip。这对我前进很有帮助。一切正常。我唯一需要添加的是“|”保留原来的分隔符。 undupinated.Add(string.Concat(keyValuePair.Key, "|", string.Join("~", keyValuePair.Value))); @Jayarikahs 哎呀,对不起。我将为此编辑我的答案。

以上是关于如何在分隔字符串的第一个元素上找到部分重复项?的主要内容,如果未能解决你的问题,请参考以下文章

R:如何在 R 中的两个重复项之间包含一个字符?

关于如何去除数组中重复项

如何在逗号分隔的字符串行中找到不同的元素?

找到左偏移量大于[重复]的第一个元素

有重复项时对最左/最右元素进行二分搜索

String.Split 仅在 C# 中的第一个分隔符上?