Как найти частичный дубликат на первом элементе строки с разделителями? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть текстовый файл с разделителями, который я читаю в массив строк.Текстовый файл будет иметь 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 значений.

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Скажем, например, что вы проанализировали строки вашего входного файла в перечисляемом списке объектов с 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);
1 голос
/ 10 апреля 2019

Вот краткий пример, который может помочь вам начать:

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