获取具有特定条件的两个列表的交集

本文关键字:两个 列表 特定条件 获取 | 更新日期: 2023-09-27 17:57:41

假设我有两个汽车列表

清单1:

  • 《法拉利》,2005年,"35万美元"
  • "宝马",2009年,"29000美元"
  • "奥迪",2011年,"33000美元"

清单2:

  • 《无限》,2005年,"267000美元"
  • "宝马",2009年,"45000美元"
  • 《法拉利》,2005年,"33万美元"
  • "丰田",2009年,"35000美元"

我知道我可以通过使用Intersect方法得到一个重复汽车的列表。但我也想保留价格较低的那一个。例如,我想要一些将返回的方法:

  • 《法拉利》,2005年,"33万美元"
  • "宝马",2009年,"29000美元"

因为这些车的名字重复,而且价格最低

完全未经测试,但这样的东西怎么样?

var result = from c1 in List1
             join c2 in List2 on c1.Name equals c2.Name
             select new CarInfo()
             {
                 Name = c1.Name, // Doesn't really matter which you take
                 Year = c1.Price < c2.Price ? c1.Year : c2.Year,
                 Price = c1.Price < c2.Price ? c1.Price : c2.Price
             };

获取具有特定条件的两个列表的交集

类似的东西?我假设您有Intersect的CarComparer IE质量位。

var cheapCars = list1.Intersect(list2, new CarComparer()).
    OrderBy(c => c.Price).
        GroupBy(c => c.Name).
            Select(g => g.FirstOrDefault());

您可能需要修复语法。。。

以下查询将在BrandYear属性上匹配汽车。如果您只关心Brand,则可以更改联接条件以满足该目的。

var results = from car1 in list1
              join car2 in list2 
                on new { car1.Brand, car1.Year } 
                equals new { car2.Brand, car2.Year }
              select (car1.Price <= car2.Price) ? car1 : car2;