1

我有两节课。

class Vehicle{
    public string VehicleId {get;set;}
    public string VinNo {get;set;}
    public int ModelYear {get;set;}
    public string Make {get;set;}
    public bool WaterDamaged {get;set;}
    }

class Vins{
    public string VinNo {get;set;}
}

我使用此类结构从数据库中填充了车辆列表。所以代码看起来有点像这样。

List<Vehicle> vehicles = GetAllVehicles();

我拥有的另一个列表来自一个文件。此列表包含所有被水损坏的 VIN。我能够为这个类使用与上面相同的结构。

List<Vins> damaged = ReadFile();

List<Vehicles> damagedGoods = new List <Vehicles>();
List<Vehicles> goodGoods = new List <Vehicles>();

我需要使用此信息创建两个单独的 XML 文件。第一个将被称为 DamagedVehicles_{date},下一个将是 GoodVehicles_{date}。

所以我所做的就是写一个这样的循环。

foreach(var v in damaged)
{
    foreach(var v2 in vehicles)
    {
        if(v.VinNo == v2.VinNo) 
        {
            damagedGoods.Add(new Vehicle{});
        }
        else
        {
            goodGoods.Add(new Vehicle{});
        }
    }
}

这导致了一个小问题。首先,goodGoods 得到了重复,后来我把它们淘汰了。其次,如果我收到一份 80,000 辆汽车的清单,这需要很长时间才能处理。有什么方法可以加快处理速度并避免重复吗?

4

1 回答 1

4

您的嵌套foreach正在执行两个列表的叉积。那是……不是你想要的。这不仅是一项固有的昂贵操作,而且它的结果根本不符合您的要求。

你想要做的是这样的:

foreach(var vehicle in vehicles)
{
    if(damaged.Contains(vehicle.VinN) 
    {
        damagedGoods.Add(new Vehicle{});
    }
    else
    {
        goodGoods.Add(new Vehicle{});
    }
}

(请注意,外部循环已完全移除。)

List由于在搜索方面不是特别有效的事实,这可以进一步改进。如果我们使用 aHashSet来固定损坏的车辆,速度Contains快得多。这很容易做到:

HashSet<Vins> damaged = new HashSet<Vins>(ReadFile());
于 2013-03-19T20:52:29.930 回答