C# 字符串数组中的LINQ Where子句
我有一个类别产品列表:C# 字符串数组中的LINQ Where子句,c#,linq,C#,Linq,我有一个类别产品列表: class Products { public string Name { get; set; } public string Size { get; set; } public string ProductId { get; set; } public string Category { get; set; } } 我想使用一个文本框来搜索任何使用通配符值的匹配产品。这将返回一个项目列表,其中搜索字符串中的所有值都可以在上面列出的四个属
class Products
{
public string Name { get; set; }
public string Size { get; set; }
public string ProductId { get; set; }
public string Category { get; set; }
}
我想使用一个文本框来搜索任何使用通配符值的匹配产品。这将返回一个项目列表,其中搜索字符串中的所有值都可以在上面列出的四个属性中找到
现在,我正在使用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))
你最好把这种逻辑放到你的产品
类中
所以你会:
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))
您还可以使用来获取所有属性名称,并对每个
字符串执行一次for each操作,检查是否包含
,简单地说,您可以编写
products.Where(x=>x.Name.Contains(search)
|| x.Size.Contains(search)
|| x.ProductId.Contains(search)
|| x.Category.Contains(search))
你最好把这种逻辑放到你的产品
类中
所以你会:
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))
您还可以使用来获取所有属性名称,并对每个字符串执行一次for each操作,并检查是否包含因此,如果您要将搜索分解为单独的关键字,使用*
作为分隔符(您在注释中已描述),那么您可以这样做:
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)));
因此,如果您要将搜索分解为单独的关键字,使用*
作为分隔符,您在注释中已经描述了这一点,那么您可以这样做:
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)));
当你说“通配符搜索”时,输入是什么样子的?您希望支持哪些通配符?另外,当您说“搜索字符串中的所有值”时,您的意思是它们可能有多个搜索项吗?一些示例输入和预期输出可能会有所帮助。我希望能够接受像“hem*per”这样的搜索值,这将返回在给定产品对象的四个值中的任何位置都可以找到“hem”和“per”的项目。这将返回一个产品,其中名称可以是“Hemerocallis”,类别可以是“Periornian”。@LiquidDrummer-因此,根据该描述,您没有进行“通配符”搜索。您只需使用一个*
作为分隔符来分隔要查找的单个字符串。@Enigmativity-是。对不起,通配符的措辞有点误导。很抱歉。@LiquidDrummer-你只是想*
划界你的关键字,我说的对吗?当你说“通配符搜索”时,输入是什么样子的?您希望支持哪些通配符?另外,当您说“搜索字符串中的所有值”时,您的意思是它们可能有多个搜索项吗?一些示例输入和预期输出可能会有所帮助。我希望能够接受像“hem*per”这样的搜索值,这将返回在给定产品对象的四个值中的任何位置都可以找到“hem”和“per”的项目。这将返回一个产品,其中名称可以是“Hemerocallis”,类别可以是“Periornian”。@LiquidDrummer-因此,根据该描述,您没有进行“通配符”搜索。您只需使用一个*
作为分隔符来分隔要查找的单个字符串。@Enigmativity-是。对不起,通配符的措辞有点误导。很抱歉。@LiquidDrummer-你只是想*
为你的关键字划界,我说的对吗?这是如何处理“通配符”要求的?我写这篇文章时,它并没有在通配符上显示为分隔符,所以在这种情况下,作者必须循环遍历每个术语,直到找到一个。这是如何处理“通配符”的需求?它不是,当我写它时,它只是在一个通配符上显示为分隔符-因此在这种情况下,作者必须循环遍历每个术语,直到找到一个为止。@RufusL-只是一些示例数据。第一个代码块使用了它。@RufusL-只是一些示例数据。第一个代码块使用它。