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

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 和 List 在内存中生成),您的存储库可以缓存并返回详细信息。无论哪种方式,这都应该是您的存储库责任,而不是控制器的责任。 嗨,这是给所有的条目。如何仅获得唯一值? VehDriverList.Distinct() 对我不起作用,有什么建议吗?【参考方案2】:

所以你有VehiclesDrivers,每个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(),
  );

【讨论】:

以上是关于合并两个列表:我对两个列表进行了硬编码,并希望打印条件匹配的两个列表数据。请让我知道我该怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

python两个列表进行合并

我有两个numpy数组列表,我希望将它们合并为一个numpy数组列表

python如何合并两个列表?

python合并两个有序列表(list)

合并两个列表并在给定列表 2 的情况下输出列表 1 的所有可能组合

Leetcode--合并两个有序链表(21)