繁体   English   中英

字符串数组中的LINQ Where子句

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM