Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串数组中的LINQ Where子句_C#_Linq - Fatal编程技术网

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-只是一些示例数据。第一个代码块使用它。