如何在 LINQ 中为泛型类型应用 OR 条件
How to apply OR condition in LINQ for generic types
我需要过滤可能包含不同字符串属性的通用对象 (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 循环解决了它。但对我来说,它看起来很脏。而且我认为当前的方法对性能有很大的影响,因为同一个列表将被迭代多次——对于每个 属性 name
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
我认为 linq Any
扩展符合这个要求。
filteredList = originalList
.Where(e => propertyNames.Any(p =>
e.GetType().GetProperty(p).GetValue(e).ToString().Contains(searchString)
)).ToList();
我需要过滤可能包含不同字符串属性的通用对象 (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 循环解决了它。但对我来说,它看起来很脏。而且我认为当前的方法对性能有很大的影响,因为同一个列表将被迭代多次——对于每个 属性 name
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
我认为 linq Any
扩展符合这个要求。
filteredList = originalList
.Where(e => propertyNames.Any(p =>
e.GetType().GetProperty(p).GetValue(e).ToString().Contains(searchString)
)).ToList();