【问题标题】:Filtering a List using a separate List of values使用单独的值列表过滤列表
【发布时间】:2020-01-03 22:16:04
【问题描述】:

我有一个车辆列表,其中包含各种字段,例如注册、年龄、发动机尺寸等。其中一个字段是 “tag” 字段,它本身是一个标签列表

我正在尝试过滤此车辆列表,以仅显示包含与单独 neededTags 列表中的值匹配的标签的车辆。

我正在尝试使用 Linq 和 Lambda 表达式来做到这一点。

我已经设法在主列表中的标记字段只是一个普通字符串字段,而不是字符串列表的情况下让它工作。代码在这里:

filteredVehicles = Vehicles.Where(x => neededTags.Any(y => y == x.tags)).ToList();

其中neededTags 是我感兴趣的标签列表。

我现在的问题是,如果车辆列表中的 Tag 元素实际上是标签列表,那么上面的比较元素会显示“运算符 '==' 不能应用于 'string' 和 'List' 类型的操作数”

我想我需要将 Vehicles Tag 列表中的每个元素与 requiredTags 列表中的元素进行比较,但我就是不知道该怎么做。

非常感谢任何帮助。

【问题讨论】:

    标签: c# list linq filtering


    【解决方案1】:

    我认为 Rene V 有最好的答案,但这也有效,我在其他帖子中也看到过这种方式。您可以在两个列表上都使用 Any 方法。我还添加了测试数据。

    filteredVehicles = Vehicles.Where(v => (v.tags ?? new List<string>()).Any(t => neededTags.Any(n => n == t))).ToList();
    

    测试代码:

    var neededTags = new List<string> { "tag1", "tag2" };
    
    var Vehicles = new[] {
        new {name = "vehicle1", tags = new List<string> { "tag1" } },
        new {name = "vehicle2", tags = new List<string> { "tag5" } }
                }.ToList();
    
    var filteredVehicles = Vehicles.Where(v => (v.tags ?? new List<string>()).Any(t => neededTags.Any(n => n == t))).ToList();
    

    【讨论】:

      【解决方案2】:

      您要检查车辆标签列表和所需标签列表的 intersection 是否有任何元素(如果车辆标签中至少有一个元素也在所需标签中) :

      filteredVehicles = Vehicles.Where(v => v.Tags.Intersect(neededTags).Any()).ToList();
      

      如果车辆的标签可能为空,则可以使用空条件运算符

      filteredVehicles = Vehicles.Where(v => v.Tags?.Intersect(neededTags).Any() == true).ToList();
      

      【讨论】:

      • 这种方法也行得通,看起来确实有不止一种方法可以给猫剥皮(并不是我以任何方式容忍对动物的暴力行为)。但是,当 Vehicles Tag 元素为“null”时,这也会产生类似的错误
      • @MikeL 不知道它可能是null...修正了我的答案
      • 对不起,我忘记了该值可能是'null'无论如何,所有三个答案都有效,我都试过了,我必须添加?和=! null 和 == true 位,以允许他们使用 Null。非常棒的工作,我真的没想到我会这么快得到答案。非常感谢我将此标记为正确答案,因为我将继续使用此方法,但前 3 个答案都对我有用。
      【解决方案3】:

      您无法将 stringstrings 的列表进行比较以获得相等性。使用.Contains 方法检查:

      // this is the short form for: .Where(x => neededTags.Any(y => x.tags.Contains(y)))
      filteredVehicles = Vehicles.Where(x => neededTags.Any(x.tags.Contains)).ToList();
      

      【讨论】:

      • 谢谢Xiaoy312,这很好,我也很接近。谢谢 但是,如果车辆记录没有任何标签并且标签元素为空,我会出错。我想你不知道解决这个问题的方法吗?我收到错误“委托给实例方法不能有 null 'this'。”
      猜你喜欢
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多