字符串数组中的LINQ Where子句

时间:2019-05-22 23:22:25

标签: c# linq

我有一个类别的产品列表:

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语句。

2 个答案:

答案 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)));