2013-03-19 5 views
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

중첩 된 foreach은 두 목록의 교차 생성을 수행하고 있습니다. 그게 ... 네가 원하는게 아니야. 본질적으로 값 비싼 작업 일뿐만 아니라 결과가 단순히 원하는 작업과 일치하지 않습니다. List 특히 효율적 아니라고

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

(외부 루프를 참고 완전히 제거됩니다.)

이 추가로 인해 개선 될 수있는 사실 : 당신이 원하는 무엇

이 같은 것입니다 검색 할 때. 손상된 차량을 붙잡기 위해 HashSet을 사용하면 Contains으로 훨씬 더이 될 것입니다. 이렇게하기가 쉽습니다.

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

답장을 보내 주셔서 감사합니다. 그것은 그것의 속도를 많이 올린다. – abhi

관련 문제