合并两个列表:我对两个列表进行了硬编码,并希望打印条件匹配的两个列表数据。请让我知道我该怎么做?
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();
}
所以你有Vehicles
和Drivers
,而每个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(),
});
合并两个列表:我对两个列表进行了硬编码,并希望打印条件匹配的两个列表数据。请让我知道我该怎么做?
我尝试使用 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();
}
所以你有Vehicles
和Drivers
,而每个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(),
});