You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:C#中向List添加自定义命名重复元素的通用算法

实现带自动计数去重的列表文件添加算法

这个需求在文件命名、资源管理场景里挺常见的,我来给你拆解一下实现思路和可复用的代码方案。

首先先明确你的初始场景:

var files = new List<string> {"file0","file1","file2","file3" };

你的核心需求是:

  • 向列表添加新文件时,如果目标名称已经存在,要生成{原始名称}({计数器})格式的唯一名称
  • 关键是要优先复用空缺的计数——比如删除file0(1)后,再次添加file0应该插入file0(1),而不是直接续成file0(3)

算法核心思路

  1. 先检查原始名称是否未被占用,如果是,直接添加
  2. 如果原始名称已存在,提取所有现有项中符合{原始名称}(数字)格式的计数
  3. 找出这些计数里最小的可用正整数(也就是第一个没被使用的数字)
  4. 用这个数字生成新名称,添加到列表

通用C#实现代码

我写了一个List<string>的扩展方法,这样可以直接在你的列表上调用,非常方便:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

public static class ListExtensions
{
    public static void AddWithUniqueNaming(this List<string> list, string baseName)
    {
        // 第一步:检查原始名称是否可用,可用直接添加
        if (!list.Contains(baseName))
        {
            list.Add(baseName);
            return;
        }

        // 第二步:匹配所有符合格式的现有项,提取计数数字
        var regexPattern = $"{Regex.Escape(baseName)}\\((\\d+)\\)";
        var existingCounters = list
            .Where(item => Regex.IsMatch(item, regexPattern))
            .Select(item =>
            {
                var match = Regex.Match(item, regexPattern);
                return int.TryParse(match.Groups[1].Value, out int num) ? num : 0;
            })
            .Where(num => num > 0) // 只保留有效的正整数计数
            .ToList();

        // 第三步:找到最小的可用计数
        int nextCounter = 1;
        while (existingCounters.Contains(nextCounter))
        {
            nextCounter++;
        }

        // 第四步:生成新名称并添加
        var newUniqueName = $"{baseName}({nextCounter})";
        list.Add(newUniqueName);
    }
}

代码关键点说明

  • 用Regex.Escape(baseName)是为了避免baseName里包含正则特殊字符(比如.、*)导致匹配出错
  • 提取计数时做了有效性校验,只保留正整数,避免无效的格式干扰
  • 找最小可用计数的逻辑确保了我们会优先复用空缺的序号,完全符合你要求的一致性

测试示例

var files = new List<string> {"file0","file1","file2","file3" };

// 第一次添加file0,已存在,添加file0(1)
files.AddWithUniqueNaming("file0");
// 第二次添加file0,现有计数是1,添加file0(2)
files.AddWithUniqueNaming("file0");
// 删除中间的file0(1)
files.Remove("file0(1)");
// 再次添加file0,此时最小可用计数是1,添加file0(1)
files.AddWithUniqueNaming("file0");

// 最终列表内容:["file0","file1","file2","file3","file0(2)","file0(1)"]

这样就完全满足你的需求了,这个方法可以通用到任何需要这种命名规则的场景里。

内容的提问来源于stack exchange,提问作者Radu Olteanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:44:21