合并两个列表:我对两个列表进行了硬编码,并希望打印条件匹配的两个列表数据。请让我知道我该怎么做?

Merging two lists: I have hardcoded two list and want to print both the list data where the condition match. Please let me know how can I do?

合并两个列表:我对两个列表进行了硬编码,并希望打印条件匹配的两个列表数据。请让我知道我该怎么做?

我尝试使用 LINQ 并找到了解决方案,但需要使用 for 循环来解决,请提供相同的建议。

    public IActionResult GetAllVehicleDrivers()
    {
        var VehicleList = new List<Vehicle>()

        {
            new Vehicle() { VehNum = "KA04AS1234", VehId = 1 },
            new Vehicle() { VehNum = "KA04AS5689", VehId = 2 },
            new Vehicle() { VehNum = "KA04AS9874", VehId = 3 },
            new Vehicle() { VehNum = "KA04AS5647", VehId = 4 },
            new Vehicle() { VehNum = "KA04AS7452", VehId = 5 },
        };

        var DriverList = new List<Driver>()
        {
            new Driver() { DriverName = "Gajaraj", DriverId = 123,  VehId = 1 },
            new Driver() { DriverName = "Tajar", DriverId = 245,  VehId = 5 },
            new Driver() { DriverName = "Pajara", DriverId = 363,  VehId = 3 },
            new Driver() { DriverName = "Haja", DriverId = 425,  VehId = 2 },
            new Driver() { DriverName = "Kaj", DriverId = 547,  VehId = 4 },
            new Driver() { DriverName = "Dajarajines", DriverId = 547,  VehId = 1 },
        };

        foreach (var i in VehicleList)
        {
            foreach (var j in DriverList)
            {
                if (i.VehId == j.VehId)
                {
                    List<dynamic> VehDriverList = new List<dynamic>()
                    {              i.VehId,
                                   i.VehNum,
                                   j.DriverId,
                                   j.DriverName
                    };
                    return Ok(VehDriverList);
                }
                else

                {
                    return NotFound();
                }
            }
        }
  }

}

看来你的嵌套循环结构不正确,在循环内有 return 语句,立即从操作方法中 returns,还在循环内实例化 List<>,覆盖previous collection 一遍又一遍。那么,这个怎么样?

// initialize the List outside the nested loop
List<dynamic> VehDriverList = new List<dynamic>();

foreach (var i in VehicleList)
{
    foreach (var j in DriverList)
    {
        if (i.VehId == j.VehId)
        {
            VehDriverList.Add(new List<dynamic>()
                {
                    i.VehId,
                    i.VehNum,
                    j.DriverId,
                    j.DriverName
                });
        }
    }
}

// return the results outside the loops
if (VehDriverList.Any())
{
    return Ok(VehDriverList);
}

return NotFound();
}

所以你有VehiclesDrivers,而每个Driver正好驱动一个Vehicle,即外键VehicleId所指的Vehicle .

理论上,同一辆载具上可以有更多 Driver。例如,如果 Driver [10] 和 Driver [11] 都有一个外键 VehicleId = [20]。在这种情况下,两个 Driver 都会驱动 Vehicl [20].

在数据库术语中,您会说 Vehicles 和 Drivers 之间存在 one-to-many 关系:每辆 Vehicle 由零个或多个 Drivers 驱动,每个 Driver正好开一辆Vehicle,即外键引用的唯一一辆Vehicle。

如果你有一个 one-to-many 关系,比如客户有零个或多个订单,学校有他们的学生,或者在你的情况下车辆有他们的 Driver,可能有两种查询:

  • 给我所有零个或多个的项目sub-items;所有车辆,每辆车都有 Drivers
  • 给我子项目,每个子项目只有一个 parent 项目;所有 Driver,每个 Driver 都有他驾驶的唯一一辆车。

在后一种情况下,您将使用 Enumerable.Join. In the first case you'll use one of the overloads ofEnumerable.GroupJoin.

的重载之一

我几乎总是使用带有参数 resultSelector 的重载,这让我有机会精确定义我想要从 Driver 和 Vehicles 获得的属性。

加入:Drivers,每个 Driver 和他的载具

var drivers = Drivers.Join(Vehicles, // Join Drivers and Vehicles

    driver => driver.VehicleId,      // from every driver take the foreign key
    vehicle => vehicle.Id,           // from every vehicle take the primary key

    // parameter resultSelector: from every driver with his one and only
    // matching vehicle, make one new:
    (driver, vehicle) => new
    {
         // Select the Driver properties that you plan to use:
         Id = driver.Id,
         Name = driver.Name,
         ...

         Vehicle = new
         {
             Id = vehicle.Id,
             Type = vehicle.Type,
             ...
         }
});

您将无法获得完全没有 Driver 的载具。毕竟:您查询的是 Drivers,而不是 Vehicles!

我的建议是不要 select 外键。您已经知道它等于 Vehicle 的主键。

GroupJoin:Vehicles,每个 Vehicle 有零个或多个 Drivers

var vehiclesWithTheirDrivers= Vehicles.GroupJoin(Drivers

    vehicle => vehicle.Id,           // from every vehicle take the primary key
    driver => driver.VehicleId,      // from every driver take the foreign key

    // parameter resultSelector: from every vehicle with its zero or more
    // drivers, make one new:
    (vehicle, driversOfThisVehicle) => new
    {
         // Select the Vehicle properties that you plan to use:
         Id = vehicle.Id,
         Type = vehicle.Type,
         ...

         Drivers = driversOfThisVehicle.Select(driver => new
         {
             // Select the Driver properties that you plan to use:
             Id = driver.Id,
             Name = driver.Name,
             ...

             // not needed, you already know the value:
             // VehicleId = driver.VehicleId,
          })
          .ToList(),
  });