1

私は2つのクラスを持っています。

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>();

この情報を使用して、2 つの個別の 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は、2 つのリストの外積を実行しています。それは...あなたが望むものではありません。それは本質的にコストのかかる操作であるだけでなく、その結果は単にあなたが望むものと一致しません。

あなたがしたいことは次のようなものです:

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());
于 2013-03-19T20:52:29.930 に答える