【问题标题】:Compare 2 lists比较 2 个列表
【发布时间】:2009-12-05 01:18:29
【问题描述】:

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

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

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

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

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

所以我不确定如何诚实地处理这件事。光是想想就让我头疼。它可能没有我想的那么糟糕,但我无法找到一种在代码中解决这个问题的好方法。

【问题讨论】:

  • 您能展示一下您目前拥有的代码吗?我很难准确地了解您正在使用的内容。
  • 让我再次分解一下。两个列表都有我要检查的这个 ID。我需要像十字路口一样...给我一个列表,列出在两个列表中都可以找到它们的 ID。然而,主要的警告和问题是,每场比赛,我都需要做一些进一步的处理。因此,如果我在两个列表中都找到 ID 4,那很好,但是我需要再检查其他内容,因为我确实找到了匹配的内容...如何在每次搜索之间插入另一组逻辑并找到其中的任何 ID两个列表都是问题
  • 所以在你给我匹配的列表之前,我需要在逻辑方面做一些额外的事情。我需要在每次找到匹配项之后再做一次检查(比如子检查)确定我是否真的应该将其包含在最终列表结果中
  • 所以它就像:1)循环并做一个交集 2)在每场比赛中做其他事情,如果其他事情是好的/坏的,那么让它失效或再次验证以确定是否保留它相交的列表。
  • 我还没有编码,因为我想不出一个好的方法来做到这一点。试图找出一个体面的方法来解决这个问题,我头疼。

标签: c#


【解决方案1】:

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

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

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

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 的混合体。

【讨论】:

  • 好的,但如果在 mylist2 的所有 SomeID 中都找到 myList1.SomeID,我该如何做一些逻辑?在我找到匹配项后,我需要做一个额外的检查。因此,每当我找到一个匹配的匹配项,反之亦然,做一些事情,然后继续找到下一个匹配项并做一些事情
  • 根据您的所有 cmets,您仍然不太清楚您在寻找什么。您是否希望根据两个列表中对象的多个属性/字段来比较这两个列表?那么如果两个列表的 SomeID 和 Field1 和 Field2 相等,那么它应该被视为相等匹配吗?
  • 不完全是。我要更新我原来的帖子。等等。
  • 天哪,太棒了。我还没有真正进入 Lambda,但是伙计,我可以看到它的力量!
  • 如何将 x.Color 替换为方法调用?
【解决方案2】:

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

然后您可以遍历这两个集合的交集。有关所有不同“集合”运算符(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();

【讨论】:

  • 谢谢,我想现在是我开始 Lambda 和 LINQ 的时候了……哇。
【解决方案3】:

IComparer 是必经之路。

【讨论】:

    猜你喜欢
    • 2022-06-26
    • 1970-01-01
    • 2013-01-21
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多