FirstOrDefault如何用条件评估内部FirstOrDefault?

Jef*_*eff 2 c# asp.net linq-to-sql

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

可以说我有一系列公司.

Companies = {Company1, Company2, Company3}
Run Code Online (Sandbox Code Playgroud)

..和每家公司都包含一系列员工姓名.

Company1.EmployeeList = {"Employee1", "Employee2"}
Company2.EmployeeList = {"Employee3", "Employee4"}
Company3.EmployeeList = {"Employee5", "Employee6"}
Run Code Online (Sandbox Code Playgroud)

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

var myCompany = Companies.FirstOrDefault(c=> c.EmployeeList.FirstOrDefault(name => name == "Employee3") != null);
Run Code Online (Sandbox Code Playgroud)

Mat*_*ell 6

我运行这段代码:

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);
Run Code Online (Sandbox Code Playgroud)

结果是:

String [] (2 items)  
  Employee3
  Employee4
Run Code Online (Sandbox Code Playgroud)

你的榜样不是在讲述整个故事吗?

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

首先,我建议您更改代码Any而不是使用FirstOrDefault != null

var myCompany = Companies
   .FirstOrDefault(c => c.EmployeeList.Any(name => name == "Employee3"));
Run Code Online (Sandbox Code Playgroud)

我还注意到你陈述:

无论内部表达式如何计算,FirstOrDefault总是返回它遇到的第一个项目

如果是这种情况,要么你FirstOrDefault以某种方式重载(不太可能),要么你的内部表达式对于你尝试过的每个例子都是正确的(例如,在EmployeeList你的第Company一个例子中,你的第一个有一个== "Employee3"真实的元素).

编辑

评论中的两条很棒的建议:

  1. ingo suggets使用list.Contains(item)而不是list.Any(el => el == item)使用以下方法:

    var myCo = Companies.FirstOrDefault(c => c.EmployeeList.Contains("Employee3"));
    
    Run Code Online (Sandbox Code Playgroud)
  2. John L建议项目(Employee?)in EmployeeList是值类型或类似,但default(Employee)不是null.

  • 不同结果的另一种可能性是`EmployeeList`是结构或其他值类型,在这种情况下,默认值不为null. (2认同)