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