检查列表中的唯一值,然后增加重复项 c# Linq

问题描述 投票:0回答:1

我有一种情况,我想枚举字符串列表,然后检查重复项,如果存在重复项,则增加末尾的数字。字符串的顺序无关紧要。

例如,如果我的清单是:

  • 测试
  • 测试仪
  • 测试仪
  • 测试仪

将改为

  • 测试
  • 测试仪
  • 测试员(1)
  • 测试员(2)

有没有简单的方法可以做到这一点?我目前的想法是进行分组,然后找到每个组的计数,然后递归地检查每个组并更改值 - 但肯定有一种更快的方法可以使用 LINQ 来完成此操作

c# linq group-by
1个回答
7
投票

您可以使用

Select
的重载来投影索引:

List<string> resultList = list
    .GroupBy(s => s)
    .SelectMany(g => g
      .Select((s, index) => $"{s}{(index == 0 ? "" : $" ({index})")}"))
    .ToList();

更新:如果您想保持注释中的原始顺序,因此不要将重复项分组在一起,而是

A,B,A => A,B,A1
,那么您可以使用此:

Dictionary<string, int> dupcounter = new();
List<string> resultList = new(list.Count);
for(int i = 0; i < list.Count; i++)
{
    string s = list[i];
    dupcounter.TryGetValue(s, out int n);
    dupcounter[s] = ++n;
    resultList.Add(n > 1 ? $"{s} ({n-1})" : s);
}

https://dotnetfiddle.net/Qtj51s

© www.soinside.com 2019 - 2024. All rights reserved.