[英]LINQ Where clause from array of strings
我有一个类别的产品列表:
class Products
{
public string Name { get; set; }
public string Size { get; set; }
public string ProductId { get; set; }
public string Category { get; set; }
}
我想使用一个TextBox来搜索任何使用通配符值的匹配产品。 这将返回一个项目列表,其中搜索字符串中的所有值都在上面列出的四个属性中的某处找到。
到目前为止,我正在使用string[] values = searchText.Split("*".ToCharArray)
将搜索字符串的值分成字符串数组(基于星号通配符)。 从那里开始,我很困惑,因为我想在类的所有属性中搜索搜索字符串的所有值。
我试图使用一个复杂的LINQ语句来弄清楚它,但是我还不能弄清楚如何使它起作用。 当我不知道要针对我的四个属性测试多少个值时,我不知道如何构建Where语句。
天真的,你可以写
products.Where(x=>x.Name.Contains(search)
|| x.Size.Contains(search)
|| x.ProductId.Contains(search)
|| x.Category.Contains(search))
您最好将这种逻辑放在Product
类中。
因此,您将拥有:
class Products
{
public bool Contains(string term) {
return Name.Contains(search) || Size.Contains(search) ||
ProductId.Contains(search) || Category.Contains(search)
}
public string Name { get; set; }
public string Size { get; set; }
public string ProductId { get; set; }
public string Category { get; set; }
}
然后简单地products.Where(x=>x.Contains(search))
您还可以使用反射来获取所有属性名称,并在每个string
上为每个属性名称做一个,然后检查Contains
。
因此,如果您将搜索分成多个单独的关键字,并使用*
作为分隔符(已在注释中进行了描述),则可以使用以下方法:
var products = new List<Products>()
{
new Products()
{
Name = "theo frederick smith",
Size = "",
ProductId = "",
Category = "brown",
}
};
var searchText = "fred*brown";
var splits = searchText.Split("*".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var results =
products
.Where(p => splits.All(s =>
p.Name.Contains(s)
|| p.Size.Contains(s)
|| p.ProductId.Contains(s)
|| p.Category.Contains(s)));
匹配输入。
另外,如果您确实要使用通配符搜索,例如"fred*smith"
(意味着任何一个字段都必须包含"fred"
后跟零个或多个字符,然后再包含"smith"
),则可以这样做:
var products = new List<Products>()
{
new Products()
{
Name = "theo frederick smith",
Size = "",
ProductId = "",
Category = "brown",
}
};
var searchText = "fred*smith";
var wildcard =
new Regex(
String.Join(".*",
searchText
.Split('*')
.Select(x => Regex.Escape(x))));
var results =
products
.Where(p => new []
{
p.Name, p.Size, p.ProductId, p.Category
}.Any(x => wildcard.IsMatch(x)));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.