【问题标题】:Search list of object based on another list of object c#根据另一个对象列表搜索对象列表c#
【发布时间】:2013-06-25 06:50:53
【问题描述】:

我有这门课:

   class Ean
   {
        public string Code{ get; set; }
   }

   class Article
   {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Ean> BarCode { get; set; }
   }


   List<Article> arts = new List<Article>();
   List<Ean> eans = new List<Ean>();

我有一个包含两个对象的列表。我需要检查列表“arts.BarCode”中是否有列表 eans 中的代码之一。如何使此搜索返回布尔值? 任何帮助都会很棒!谢谢!

这样的东西会很完美:

bool hasCheese = arts.Any(a => a.Name == "Cheese");

【问题讨论】:

    标签: c# list search object


    【解决方案1】:
    arts.SelectMany(a => a.BarCode).Intersect(eans).Any()
    

    如果我正确理解您的问题,这应该是一种有效的方法。

    arts.SelectMany(a => a.BarCode)
    

    将所有 BarCode 集合展平为 Enumerable&lt;Ean&gt;,然后您可以将其与您的其他集合相交,看看是否还有任何剩余。

    【讨论】:

      【解决方案2】:

      好吧,你可以使用:

      bool hasCode = arts.Any(a => a.BarCode.Intersect(eans).Any());
      

      这是假设要么您想单独处理每个 Ean 对象,或者您实际上已经适当地覆盖了 EqualsGetHashCode

      创建一个集合会更有效:

      var set = new HashSet<Ean>(eans);
      bool hasCode = arts.Any(a => a.BarCode.Any(e => set.Contains(e)));
      

      作为一种替代方法,您可以将列表展平为基本上是一系列条形码:

      bool hasCode = arts.SelectMany(a => a.BarCode)
                         .Intersect(eans)
                         .Any();
      

      这实际上可能是最简洁的方法,因为您不关心哪个文章具有匹配的条形码。

      【讨论】:

      • 如果我使用第一个给我一个错误:值不能为空。参数名称:first 。为什么 ?谢谢
      • @enzop92:这表明您的引用之一为空。但是,由于您甚至没有说哪个方法调用失败了,所以很难告诉您是哪个……我建议您仔细查看您的数据。
      • Jon 非常感谢你......你很友善!