.net 如何比较两个不同的对象列表?

xoshrz7s  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(149)

我有两个清单:

List<image> ImagesByPerimeterId
List<PerimeterTile> ImagesWithMorePerimeters

上下文如下:我想从ImagesByPerimeterId列表中删除包含在ImagesWithMorePerimeters列表中找到的ID的图像。ImagesWithMorePerimeters列表有一个imageId属性,可以与第一个属性进行比较。
我已经实现了这个逻辑,它运行得非常好:

foreach(var i in ImagesByPerimeterId) 
{
  foreach(var j in ImagesWithMorePerimeters) 
  {
    if (i.Id == j.ImageId) 
    {
      ImagesByPerimeterId.Remove(i);
    }
  }
}

但我在寻找一种比较这些列表的更简单的方法,有什么建议吗?
我尝试使用list.Except(),但由于列表是不同的对象,因此无法使用

lymnna71

lymnna711#

您试图在遍历列表时修改列表,这将在调用方法Remove()时导致异常:
无效操作异常错误:集合已修改;枚举操作可能无法执行。
如果你想使用迭代来完成它,那么就做这个:

for (var i2 = 0; i2 < ImagesWithMorePerimeters.Count; i2++)
{
    for (var i1 = ImagesByPerimeterId.Count - 1; i1 >= 0; i1--)
    {
        if (ImagesWithMorePerimeters[i2].ImageId == ImagesByPerimeterId[i1].Id)
            ImagesByPerimeterId.RemoveAt(i1);
    }
}

如果你想让它更短,你可以使用Linq:

ImagesByPerimeterId.RemoveAll(image => ImagesWithMorePerimeters.Any(imageMore => image.Id == imageMore.ImageId));

Linq版本的速度会慢5倍左右,下面是基准测试:

|         Method |      Mean |
|--------------- |----------:|
| UsingIteration |  2.314 us |
|      UsingLinq | 10.348 us |
fzwojiic

fzwojiic2#

您可以执行此操作,result将是ImageId的列表

var result = ImagesByPerimeterId.Select(i => i.ImageId).
Except(ImagesWithMorePerimeters.Select(j => j.ImageId)).ToList();

相关问题