【问题标题】:在 lambda 表达式中使用三元运算符
【发布时间】: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 内的代码(三元运算符)。

【问题讨论】:

  • 这与三元运算符无关,而是与您的数据结构有关。您的studentidsList<string>,因此studentids.Contains 将不得不查看该列表中的每个元素以检查您的状况。以HashSet<string> 为例,它提供更快(即恒定时间)的查找
  • 同意,var studentIDs = students.Select(x => x.StudentID).ToHashSet(); 可能会提供一些加速,但是students 来自哪里,它有多少条记录,GetAllStudents 是什么样的,它返回了多少条记录?可能有更好的策略来编写这些数据,包括让数据库发生在 c# 代码中的 donwhatbis
  • @derpirscher 认为说“接近恒定时间”可能更准确 - HashSet 确实需要表现得像一个链表,有时这会将其击退一些,但通常比列表查找要好得多时间

标签: c# .net entity-framework linq


【解决方案1】:

正如@derpischer 在表扬中提到的那样,您是否尝试过使用 HashSet?

将第一行替换为以下内容:

var studentIDs = new HashSet<string>(students.Select(x => x.StudentID));

这将加快您的执行时间。请让我知道它是否有效。

【讨论】:

  • 好的,让我试一试。但是,我的重点是简化“包含”中的三元运算符
【解决方案2】:

我认为你的逻辑方法很好。我认为您可以以更清晰,更轻松的方式呈现它。考虑以下内容:

HashSet<string> studentIDs = students.Select(s => s.StudentID)
    .ToHashSet();

string StudentID(RawDataStudent s) => string.IsNullOrWhiteSpace(s.StudentNumber)
    ? $"{s.EnrollNumber}{s.SequenceNumber}"
    : $"{s.StudentNumber}{s.SequenceNumber}";

var rawData = StudentManager.GetAllData();
var resultList = rawData.Where(s => !studentIDs.Contains(StudentID(s)))
    .ToList();

要点:

  • 将整个 'contains' lambda 提取出来,并将其显示为一个明确命名的函数,意图是 - 良好的可读性
  • 始终尝试使用布尔值以肯定的方式工作 - 特别是你最终得到了这个带有 null 或空格的奇怪括号否定,只需切换返回 - 也更容易阅读
  • 正如其他发帖人所评论的那样,针对 HashSet 调用 contains 会快得多
  • 请注意,我已经假设了您的 GetAllData 返回类型 - var 有点邪恶的一个很好的例子

【讨论】:

    猜你喜欢
    • 2014-11-13
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2019-02-10
    • 2013-01-16
    • 2012-09-02
    相关资源
    最近更新 更多