如何在分隔字符串的第一个元素上找到部分重复项?
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);
我有一个竖线分隔的文本文件,我将其读入字符串数组。文本文件将有 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);