比较2个列表

时间:2009-12-04 15:59:36

标签: c#

我会尽力在这里解释我的头痛。

我有2个通用列表,它们包含相同的类型,因此包含相同类型的字段:

List<Car> car1 = GetCars1();
List<Car> car2 = GetCars2();
List<Car> finalListOfCars2 = new List<Car>();

所以Car有一个名为BumperTypeID的字段

我想将car1与car2进行比较,并从car2中找到那些car2,其中car2 [index] .BumperTypeID存在于car1的BumperTypeIDs列表中的所有BumperTypeID列表中。如果它在car1的BumperTypeIDs列表中找到,那很好......但是我需要在此之后再做一次检查以检查ColorIsBlack。如果第二次检查结果为真,那么确定我们很好,将当前的car2 [index]添加到finalList。

所以我不确定如何诚实地解决这个问题。只是想着它让我头疼。它可能没有我想象的那么糟糕,但我不能用一种很好的方式来解决这个问题。

3 个答案:

答案 0 :(得分:5)

不完全清楚您要查找的内容,但要将列表与列表进行比较,您可以使用Intersect<T>()扩展方法。它将返回两个列表中存在的所有项目的列表。

如果您要查找一个列表中存在但不存在另一个列表的项目,请使用Except<T>()方法。

编辑:根据您的编辑,您的代码将如下所示:

public void CompareLists(List<Car> carList1, List<car> carList2){
    var car1Ids = carList1.Select(l => l.BumperTypeID);
    var car2Ids = carList2.Select(l => l.BumperTypeID);

    // Find all cars in List2 that have matching BumperTypeID's
    // and filter it that list further based on the color.
    var matchedIds = car2Ids.Intersect(car1Ids).Where(x => x.Color == Color.Black);

    // do your work here.
}

这是我在其他地方用来合并项目列表的方法。您可以参考我的answer in another question了解更多详情。

EDIT2:根据您更新的问题,我更新了代码。这假设集合中有一个唯一的BumperTypeID列表。我认为你的解决方案将是这个解决方案与Chris's answer的混合。

答案 1 :(得分:1)

你的预感是正确的,Linq可以很容易地找到两个列表的交集。使用Intersects方法,并传入您自己的自定义IEqualityComparer,它比较列表中的两个对象以确定它们是否相同。

然后,您可以迭代两个集合的交集。有关所有不同“Set”运算符(Union,Intersect,Except等)的更多信息,请查看here

编辑:

要添加其他过滤器,只需将其他Linq运算符链接到此查询即可。例如:

IDList1.Intersects(IdList2, MyIdComparer).Where(entry => entry.SomethingINeedToCheck == true);

再次编辑:

以上是上述条款,但针对您的新修改进行了更新:

var ResultList = cars1.Intersects(cars2, CarIdComparer).Where(car => car.IsColorBlack).ToList();

答案 2 :(得分:0)

IComparer 是要走的路。