我有这个问题,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);
答案 0 :(得分: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);
结果是:
String [] (2 items)
Employee3
Employee4
你的例子不是在讲述整个故事吗?
Company1
Employee3
EmployeeList
是否有Employees
String
实际上不是==
(即Any
是否过载或类似)首先,我建议您更改代码以使用FirstOrDefault != null
而不是var myCompany = Companies
.FirstOrDefault(c => c.EmployeeList.Any(name => name == "Employee3"));
FirstOrDefault
我还注意到你声明:
FirstOrDefault总是返回 它遇到的第一个项目,无论如何 如何评估内在表达
如果是这种情况,要么以某种方式(不太可能)重载EmployeeList
,要么对于您尝试的每个示例,您的内部表达总是为真(即在示例中,Company
你的第一个== "Employee3"
有一个list.Contains(item)
为真的元素。
修改强>
评论中的两条很棒的建议:
使用list.Any(el => el == item)
而不是var myCo = Companies.FirstOrDefault(c => c.EmployeeList.Contains("Employee3"));
来构建ingo,这意味着使用:
Employee
John L建议EmployeeList
中的项目(default(Employee)
?)是值类型或类似内容,因此null
不是{{1}}。