代码之家  ›  专栏  ›  技术社区  ›  Pete Irfan TahirKheli

基于IEnumerable<string>筛选项目

  •  2
  • Pete Irfan TahirKheli  · 技术社区  · 10 年前

    我有一个具有属性(ProductNames)的项目列表,该属性是 IEnumberable<string> 。我如何在属性上筛选此列表,以便仅获得该项与另一项中的所有项匹配的列表 IEnumerable<string> (FilterProductNames)?

    我尝试了以下操作,但它似乎返回了过滤器IEnumberable中与任何内容(OR样式匹配)匹配的所有项目:

    Items.Where(x => x.ProductNames.Intersect(FilterProductNames).Any())
    

    更新

    我已经尝试使用下面Tim的答案,但它似乎给了我一个空集,所以我只尝试了FilterProductNames中的一个项目,但这仍然没有返回任何结果,所以我通过执行以下操作测试了相同的筛选器:

    if (count == 1)
    {
        // this will return me 4 items
        Items = Items.Where(x => x.ProductNames.Contains(FilterProductNames.First()));
    }
    else
    {
        // when I remove the above if, this will return me 0 items filtering on the same thing
        Items = Items.Where(x => x.ProductNames.All(pn => FilterProductNames.Contains(pn)));
    
        // have also tried the other version on tim's answer but to no avail:
        // Items = Items.Where(x => !x.ProductNames.Except(FilterProductNames).Any());
    }
    

    更新2

    很抱歉,措辞不好,造成了一些混乱。我正在搜索包含FilterProductNames中所有名称的项目,但不限于FilterProductName中的项目,因此,例如,如果我搜索产品名称为Test和Test1的项目,它应该会返回包含这两个名称以及任何其他名称的项目。

    这可能吗?

    1 回复  |  直到 10 年前
        1
  •  6
  •   Tim Schmelter    10 年前

    您可以使用 Enumerable.All :

    Items.Where(x => x.ProductNames.All(pn => FilterProductNames.Contains(pn)))
    

    或-可能更有效-使用 ! ... Except.Any :

    Items.Where(x => !x.ProductNames.Except(FilterProductNames).Any());
    

    编辑 根据您的评论/编辑: “…包含FilterProductNames中所有名称的所有项目”

    然后,你必须颠倒这个说法:

    Items.Where(x => FilterProductNames.All(fp => x.ProductNames.Contains(fp)));
    

    Items.Where(x => !FilterProductNames.Except(x.ProductNames).Any());