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);
我运行以下代码:
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
你的例子没有说明全部吗?
-
Company1
在EmployeeList
中是否有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
(不太可能),要么您的内部表达式对于您尝试过的每个示例总是为真(即在示例中,您的第一个Company
的EmployeeList
具有== "Employee3"
为真的元素)。
编辑
来自评论的两个伟大的建议:
ingo建议使用
list.Contains(item)
而不是list.Any(el => el == item)
,这意味着使用:var myCo = Companies.FirstOrDefault(c => c.EmployeeList.Contains("Employee3"));
John L建议
EmployeeList
中的项目(Employee
?)是值类型或类似的,因此default(Employee)
不是null
。