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

C# Excel解析生成学生账号时HashSet<Student>去重实现咨询

实现方案

核心逻辑思路

  • 提前提取已存在的所有账号名到独立的HashSet<string>,实现O(1)复杂度的存在性校验,大幅提升处理效率
  • 保留初始生成的无后缀账号作为基准名,若账号已存在则从2开始递增后缀,直到找到未被使用的账号
  • 每确定一个可用账号后同步更新已存在账号集合,避免同批次导入的重复缩写账号冲突

注意事项

你需要先确认Student类的相等性逻辑:如果HashSet<Student>需要按账号去重,请重写Student的Equals和GetHashCode方法,仅通过AccountName字段判断相等,否则HashSet的默认引用比较逻辑会失效。

修改后的完整代码

public static void Parse(string filePath, InputSettings settings, Predicate<string> condition, ref HashSet<Student> students)
{
    // 提前提取所有已存在的账号,用于O(1)复杂度的存在性校验
    var existingAccounts = new HashSet<string>(students.Select(s => s.AccountName));
    
    using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read))
    {
        using (var reader = ExcelReaderFactory.CreateReader(stream))
        {
            var result = reader.AsDataSet(new ExcelDataSetConfiguration
            {
                //ConfigureDataTable = _ => new ExcelDataTableConfiguration()
                //{
                //    UseHeaderRow = true
                //}
            });

            var sheet1 = result.Tables[0];

            for (var i = 0; i < sheet1.Rows.Count; i++)
            {
                var specialtyName = sheet1.Rows[i][settings.SpecialtyColumn].ToString().Trim();

                if (condition(specialtyName))
                {
                    var facultyNumber = sheet1.Rows[i][settings.FacultyColumn].ToString();
                    var originalStudentName = Regex.Replace(sheet1.Rows[i][settings.NameColumn].ToString(), @"\s{2,}", " ");
                    var studentName = Transliteration.CyrillicToLatin(originalStudentName.ToUpper()).ToUpper();
                    var nameAbbreviation = string.Join("", studentName.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Substring(0, 1).ToLower()));
                    var accountName = $"{settings.SpecialtyAbbreviation}{facultyNumber.Substring(0, 2)}{nameAbbreviation}";

                    // 账号去重逻辑
                    var baseAccountName = accountName;
                    int suffix = 2;
                    while (existingAccounts.Contains(accountName))
                    {
                        accountName = $"{baseAccountName}{suffix}";
                        suffix++;
                    }
                    // 将新账号加入已存在集合,避免同批次重复
                    existingAccounts.Add(accountName);

                    students.Add(new Student
                    {
                        AccountName = accountName,
                        FacultyNumber = facultyNumber,
                        StudentName = studentName,
                        OriginalStudentName = originalStudentName,
                        SpecialtyName = settings.SpecialtyName,
                        Abbreviation = settings.SpecialtyAbbreviation,
                    });
                }
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:54:01