2013-06-29 3 views
0

I는 예를 들어 개체에C 번호, 오브젝트의 두리스트 모두 객체에 하나 개의 변수 사이의 차이를 발견

List<AcsRecord> Textrecords = AcsFileParser.Parsefile(path1); 
List<ExcelRecord> Execelrecords = excelFileParser.Parsefile(path2); 

을 두 개의 파일 (.txt 인 및 .XLS) 저장 다양한 다른 필드를 파싱하는 프로그램을 가지고 AcsRecord :

public string EID {get; set;} 
public string Name {get; set;} 

Excel 레코드의 이름 레코드는 비슷합니다. 나는 AcsRecord에서 Excelrecord에서 찾을 수없는 모든 이름을 찾았습니다. linq join을 사용하여, 나는 동등한 것을 찾을 수 있습니다. 각 레코드의 이름 필드를 참조하는 방법을 잘 모르겠습니다. 어쩌면! contains() 같은 것을? 감사합니다. .

var excelNames = new HashSet<string>(excelRecords.Select(x => x.Name)); 
var textRecordsNotInExcel = textRecords.Where(t => !excelNames.Contains(t.Name)) 
             .ToList(); 

여기 HashSet<string>를 만드는 포인트는 방법으로는 Contains 검사가 매우 저렴하게하는 것입니다 :

답변

9

예, 당신이 뭔가를 할 수 있습니다. A List<string>도 작동하지만 (예 : var excelNames = excelRecords.Select(x => x.Name).ToList();) 각 텍스트 레코드의 모든 Excel 레코드 이름에 O (N) 체크가 필요합니다.

편집 : 당신은 단지 이름을하지 Excel에서 텍스트 기록을 원하는 경우에, 그것은 훨씬 쉽게 :

var missingNames = textRecords.Select(t => t.Name) 
           .Except(excelRecords.Select(e => e.Name)) 
           .ToList(); 
+0

굉장해. 이 var를 foreach 루프에 넣어 콘솔에 출력 할 수 있습니까? – Cassus

+0

@jonskeet - 일단 HashSet을 사용하면 'Except()'를 사용하는 것이 더 빠르지 않습니까? – Hogan

+0

@Hogan - HashSet에는 ExceptWith가 있지만 O (n)이기는하지만 Except 메소드가 없습니다 (IEnumerable.Except는 O (n)입니다). HashSet.Contains는 O (1)이므로 대부분의 경우'HashSet.Contains'를 사용하는 것이 더 효율적입니다. – keyboardP

0

당신이있는 바로, 당신은 이런 식으로 같은 !Contains()해야한다 :

var query= from ar in Textrecords 
      let er=Excelrecords.Select(r=>r.Name) 
      where !er.Contains(ar.Name) 
      select ar;