我需要過濾可能包含不同字串屬性的通用物件 (TItem) 串列,例如“名稱”、“描述”、“電子郵件”、“街道”等。根據物件型別,我可以傳遞搜索鍵串列(字串)用于過濾目的。在以下針對當前物件的示例中,我傳遞了兩個搜索鍵,稍后我將使用它們按名稱獲取屬性值。但是對于另一個物件,它可以是具有不同名稱的任何其他數量的搜索鍵。當我事先知道搜索鍵的數量時,我可以將其硬編碼如下:
var searchString = "john";
var propertyNames = new List<string>() { "Name", "Email" };
var originalList = new List<TItem>();
var filteredList = new List<TItem>();
// don't know how to apply OR (||) condition in below Where() method depending on how many search keys I might have
// I need to dynamically loop through searchKeys inside of Where()
filteredList = originalList.Where(e =>
e.GetType().GetProperty(propertyNames[0]).GetValue(e).ToString().Contains(searchString) ||
e.GetType().GetProperty(propertyNames[1]).GetValue(e).ToString().Contains(searchString)
).ToList();
但我無法弄清楚如何動態地回圈遍歷 LINQ 內部的搜索鍵。是否可以使用任何回圈技術動態添加“或”條件?也可以提供其他方法。介面方法在這里不起作用,因為屬性名稱完全不同。
更新:現在,我使用嵌套的 foreach 回圈解決了它。但對我來說,它看起來很臟。而且我認為當前的方法對性能有很大影響,因為同一個串列將被迭代多次 - 對于每個屬性名稱
filteredList = new List<TItem>();
foreach (var property in propertyNames)
{
foreach (var item in originalList)
{
var match = item.GetType().GetProperty(property).GetValue(item).ToString().ToLower().Contains(searchString.ToLower());
if (match && !filteredList.Contains(item))
{
filteredList.Add(item);
}
}
}
仍在尋找更清潔、更簡潔的解決方案。最好使用 LINQ
uj5u.com熱心網友回復:
我認為 linqAny擴展符合這個要求。
filteredList = originalList
.Where(e => propertyNames.Any(p =>
e.GetType().GetProperty(p).GetValue(e).ToString().Contains(searchString)
)).ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/446626.html
