【发布时间】:2022-01-21 21:04:24
【问题描述】:
我需要从 studentids 列表中查找不包含值的记录。没有 1:1 匹配字段。记录包含 3 个关键字段,根据条件,我必须与 studentids 列表进行比较。
例如:如果 rawdata 记录有非空的 studentnumber 值,那么我必须连接 studentnumber 和 sequencenumber 并检查该组合是否存在于 studentids 列表中。否则,我必须连接 EnrollNumber 和 SequenceNumber。
我正在尝试在 contains 中使用三元运算符,如下所示,
var studentIDs = students.Select(x => x.StudentID).Distinct().ToList();
var rawData = StudentManager.GetAllData();
var resultList = rawData.Where(x => !studentIDs.Contains($"{(!string.IsNullOrWhiteSpace(x.StudentNumber)? (x.StudentNumber+x.SequenceNumber):(x.EnrollNumber+x.SequenceNumber))}")).ToList();
但是,对于较大的数据集(超过 5K),它似乎变得越来越慢。任何关于替代方法或改进方式的建议将不胜感激。特别是,如果可以简化 Contains 内的代码(三元运算符)。
【问题讨论】:
-
这与三元运算符无关,而是与您的数据结构有关。您的
studentids是List<string>,因此studentids.Contains将不得不查看该列表中的每个元素以检查您的状况。以HashSet<string>为例,它提供更快(即恒定时间)的查找 -
同意,
var studentIDs = students.Select(x => x.StudentID).ToHashSet();可能会提供一些加速,但是students来自哪里,它有多少条记录,GetAllStudents 是什么样的,它返回了多少条记录?可能有更好的策略来编写这些数据,包括让数据库发生在 c# 代码中的 donwhatbis -
@derpirscher 认为说“接近恒定时间”可能更准确 - HashSet 确实需要表现得像一个链表,有时这会将其击退一些,但通常比列表查找要好得多时间
标签: c# .net entity-framework linq