FirstOrDefault如何用条件计算内部的FirstOrDefault

本文关键字:FirstOrDefault 内部 计算 条件 何用 | 更新日期: 2023-09-27 17:55:01

我有这个问题,无论内部表达式如何求值,FirstOrDefault总是返回它遇到的第一个项。

假设我有一个公司数组。

Companies = {Company1, Company2, Company3}

. .和每个公司包含一个员工姓名数组。

Company1.EmployeeList = {"Employee1", "Employee2"}
Company2.EmployeeList = {"Employee3", "Employee4"}
Company3.EmployeeList = {"Employee5", "Employee6"}

为什么我总是收到第一个具有以下代码的公司?

var myCompany = Companies.FirstOrDefault(c=> c.EmployeeList.FirstOrDefault(name => name == "Employee3") != null);

FirstOrDefault如何用条件计算内部的FirstOrDefault

我运行以下代码:

string[] s1 = new [] {"Employee1", "Employee2"};
string[] s2 = new []  {"Employee3", "Employee4"};
string[] s3 = new []  {"Employee5", "Employee6"};
string[][] s = new [] { s1,s2,s3 };
var result = s.FirstOrDefault(c => c.FirstOrDefault(n => n == "Employee3") != null);

结果是:

String [] (2 items)  
  Employee3
  Employee4

你的例子没有说明全部吗?

  • Company1EmployeeList中是否有Employee3 ?
  • 我看到你正在使用LINQ-to-SQL,如果这是正确的,你如何在LINQ-to-SQL模型上有一个属性,这是一个字符串数组?你添加了一个扩展方法/部分方法来创建这个数组吗?
  • Employees实际上不是String(即==过载或类似)

作为开始,我建议将代码更改为使用Any而不是FirstOrDefault != null

var myCompany = Companies
   .FirstOrDefault(c => c.EmployeeList.Any(name => name == "Employee3"));

我还注意到你说:

FirstOrDefault总是返回它遇到的第一个项目内部表达式如何求值

如果是这种情况,要么您以某种方式重载了FirstOrDefault(不太可能),要么您的内部表达式对于您尝试过的每个示例总是为真(即在示例中,您的第一个CompanyEmployeeList具有== "Employee3"为真的元素)。

编辑

来自评论的两个伟大的建议:

  1. ingo建议使用list.Contains(item)而不是list.Any(el => el == item),这意味着使用:

    var myCo = Companies.FirstOrDefault(c => c.EmployeeList.Contains("Employee3"));
    
  2. John L建议EmployeeList中的项目(Employee ?)是值类型或类似的,因此default(Employee)不是null