我有一个类别的产品列表:
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语句。
答案 0 :(得分:1)
天真的,你可以写
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))
您还可以使用reflection获取所有属性名称,并在每个string
上分别输入a,然后检查Contains
。
答案 1 :(得分:1)
因此,如果您要将搜索分解为单独的关键字,并使用*
作为分隔符(如注释中所述),那么您将这样做:
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)));