С#: переименовать/заменить дубликаты в списке добавленным номером

У меня есть List<string>, где я хотел бы заменить все дубликаты добавленным к ним номером. Примером может быть:

{"Ply0", "Ply+45", "Ply-45", "Ply0"}

Я бы хотел, чтобы у каждого "Ply0" было уникальное имя, поэтому замените их на "Ply0_1" и "Ply0_2". Важно, чтобы порядок списка оставался прежним. После этого список должен выглядеть так:

{"Ply0_1", "Ply+45", "Ply-45", "Ply0_2"}

Сначала я попытался найти дубликаты с помощью LINQ, но я новичок в этом, и у меня также есть проблемы с заменой их добавленным номером при сохранении порядка исходного списка.

Любая помощь будет принята с благодарностью!


person didyousaydisco    schedule 23.06.2018    source источник
comment
что ты уже испробовал? Можете ли вы поделиться своим кодом? Хорошее упражнение - сначала написать его без Linq.   -  person aloisdg    schedule 23.06.2018


Ответы (1)


Используя linq, это можно сделать так, но я не думаю, что это очень читабельно.

var listx = new List<string>() { "Ply0", "Ply+45", "Ply-45", "Ply0" };

var res = listx.Select((s, i) => new { orgstr=s, index = i })
          .GroupBy(x => x.orgstr)
          .SelectMany(g => g.Select((x, j) => new { item = x, suffix = j + 1, count = g.Count() }))
          .OrderBy(x => x.item.index)
          .Select(x => x.count == 1 ? x.item.orgstr : x.item.orgstr + "_" + x.suffix)
          .ToList();
person Eser    schedule 23.06.2018