基于对象c#的另一个列表搜索对象列表

本文关键字:对象 列表 搜索 另一个 于对象 | 更新日期: 2023-09-27 18:20:06

我有这个类:

   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#的另一个列表搜索对象列表

好吧,可以只使用:

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

这实际上可能是最干净的方法,因为你不在乎哪篇文章有匹配的条形码。

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

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

arts.SelectMany(a => a.BarCode)

将所有BarCode集合展平为Enumerable<Ean>,然后可以将其与另一个集合相交,查看是否还有剩余的内容。