簡體   English   中英

FirstOrDefault 如何評估帶有條件的內部 FirstOrDefault?

[英]How does FirstOrDefault evaluate an inner FirstOrDefault with a condition?

我有這個問題,無論內部表達式如何評估,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 model 上擁有一個屬性? 您是否添加了擴展方法/部分方法來創建此數組?
  • Employees實際上不是String (即==是否重載或類似)

首先,我建議您將代碼更改為使用Any而不是FirstOrDefault != null

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

我還注意到你 state:

無論內部表達式如何評估,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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM