在下面的代碼中,過濾器的第二部分正在執行,即使第一部分已經回傳“true”。我理解使用“||” 如果第一部分為真,則操作員不應執行第二部分驗證。
List<data> query = new List<data>();
query.Add(new data { name = "John", surname= "Mazi" });
query.Add(new data { name = "Joseph", surname= "Doe" });
query.Add(new data { name = "Paul", surname= "Allen" });
query.Add(new data { name = "John", surname = "Doe" });
data filters = new data { name = "John", surname = "Doe" };
List<data> data = query.Where(x => ((x.name.Trim().ToUpper() == filters.name.Trim().ToUpper()
& x.surname.Trim().ToUpper() == filters.surname.Trim().ToUpper())
||
(x.name.Trim().ToUpper().Contains(filters.name.Trim().ToUpper())
| x.surname.Trim().ToUpper().Contains(filters.surname.Trim().ToUpper())))).ToList();
在上面的示例中,它應該只回傳一項,但它一直回傳三項。
uj5u.com熱心網友回復:
您對 or 運算子的理解是正確的,但您必須考慮到,您的驗證將對串列中的每個條目執行。考慮到這一點,如果您通過驗證,您將了解為什么在這種情況下會回傳三個資料集。為了可讀性和易用性,在您的情況下,我會將驗證分為兩部分:
List<data> data = query.Where(x => ((x.name.Trim().ToUpper() == filters.name.Trim().ToUpper()
& x.surname.Trim().ToUpper() == filters.surname.Trim().ToUpper()).ToList();
//If no exact matches, get datasets where name/ surname is contained
if(!data.Any())
{
data = query.Where(x => (x.name.Trim().ToUpper().Contains(filters.name.Trim().ToUpper())
|| (x.surname.Trim().ToUpper().Contains(filters.surname.Trim().ToUpper())).ToList();
}
這將首先嘗試回傳每個精確匹配,如果沒有,則回傳包含姓名或姓氏的每個資料集。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510678.html
標籤:C#林克
