0

我有这堂课:

   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");
4

2 回答 2

3

好吧,你可以使用:

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

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

但是,创建一个集合会更有效:

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();

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

于 2013-06-27T16:45:37.573 回答
2
arts.SelectMany(a => a.BarCode).Intersect(eans).Any()

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

arts.SelectMany(a => a.BarCode)

将所有 BarCode 集合展平为Enumerable<Ean>,然后您可以将其与其他集合相交并查看是否有任何剩余。

于 2013-06-27T16:47:43.557 回答