分离列表的更快捷方式

时间:2013-03-19 20:46:19

标签: c# performance list

我有两节课。

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辆车的清单,则需要很长时间才能完成。 有什么方法可以加快处理速度并避免重复吗?

1 个答案:

答案 0 :(得分:4)

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

你想要做的是这样的事情:

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

(注意外环完全被移除。)

由于List在搜索时不是特别有效,因此可以进一步改进。如果我们使用HashSet来抓住损坏的车辆,Contains将会更快 。这很容易做到:

HashSet<Vins> damaged = new HashSet<Vins>(ReadFile());