我会尽力在这里解释我的头痛。
我有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。
所以我不确定如何诚实地解决这个问题。只是想着它让我头疼。它可能没有我想象的那么糟糕,但我不能用一种很好的方式来解决这个问题。
答案 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 是要走的路。