我有一种情况,我想枚举字符串列表,然后检查重复项,如果存在重复项,则增加末尾的数字。字符串的顺序无关紧要。
例如,如果我的清单是:
- 测试
- 测试仪
- 测试仪
- 测试仪
将改为
- 测试
- 测试仪
- 测试员(1)
- 测试员(2)
有没有简单的方法可以做到这一点?我目前的想法是进行分组,然后找到每个组的计数,然后递归地检查每个组并更改值 - 但肯定有一种更快的方法可以使用 LINQ 来完成此操作
您可以使用
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);
}