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
相关产品推荐
相关产品推荐

