合并两个列表:我对两个列表进行了硬编码,并希望打印条件匹配的两个列表数据。请让我知道我该怎么做?
Posted
技术标签:
【中文标题】合并两个列表:我对两个列表进行了硬编码,并希望打印条件匹配的两个列表数据。请让我知道我该怎么做?【英文标题】: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? 【发布时间】:2021-11-17 01:05:26 【问题描述】:合并两个列表:我已经对两个列表进行了硬编码,并且想要打印条件匹配的两个列表数据。请告诉我该怎么做?
我尝试使用 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();
【问题讨论】:
【参考方案1】:您的嵌套循环结构似乎不正确,在循环内有 return 语句,立即从 action 方法返回,还在循环内实例化 List,一遍又一遍地覆盖以前的集合。那么,这个怎么样?
// 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();
【讨论】:
附注我会亲自创建一个视图模型/ DTO,例如VehicleDriver,而不是使用动态的。动态适用于您不知道属性的情况,例如与 COM 对象的互操作性,但在这里您非常清楚要返回的属性。 有没有办法在另一个Getby Id方法中访问VehDriverList数据的数据并访问驱动详情? @Gopal,虽然您可以使用 Sessions(将 VehDriverList 存储在 Session 对象中并在 GetById() 操作方法中检索它),但这不是最好的方法。如果您使用存储库模式来访问数据,如果它从数据库中检索数据,您的 GetById() 应该直接从您的存储库中获取详细信息,并且如果数据在内存中(您的 List所以你有Vehicles
和Drivers
,每个Driver
正好驱动一个Vehicle
,即外键VehicleId
所指的Vehicle。
理论上,同一辆车上可能有更多司机。例如,如果 Driver [10] 和 Driver [11] 都具有外键 VehicleId = [20]。在这种情况下,两位司机都将驾驶车辆 [20]。
在数据库术语中,您会说 Vehicles 和 Drivers 之间存在一对多的关系:每辆 Vehicle 由零个或多个 Drivers 驾驶,每个 Driver 只驾驶一辆 Vehicle,即唯一一辆外键指代。
如果您有一对多的关系,例如客户有零个或多个订单,学校有学生,或者在您的情况下,车辆有司机,可能有两种查询:
给我所有项目及其零个或多个子项目;所有车辆,每辆车及其司机 给我子项,每个子项及其唯一的父项;所有车手,每位车手都有他驾驶的唯一一辆车辆。在后一种情况下,您将使用Enumerable.Join 的重载之一。在第一种情况下,您将使用Enumerable.GroupJoin 的一个重载。
我几乎总是使用带有参数 resultSelector
的重载,这让我有机会精确定义我想要从 Drivers 和 Vehicles 获得的属性。
加入:司机,每个司机都有他的车辆
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,
...
);
你不会得到完全没有司机的载具。毕竟:您查询的是 Drivers,而不是 Vehicles!
我的建议是不要选择外键。您已经知道它等于 Vehicle 的主键。
GroupJoin:车辆,每辆车都有零个或多个司机
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(),
);
【讨论】:
以上是关于合并两个列表:我对两个列表进行了硬编码,并希望打印条件匹配的两个列表数据。请让我知道我该怎么做?的主要内容,如果未能解决你的问题,请参考以下文章
我有两个numpy数组列表,我希望将它们合并为一个numpy数组列表