2012-08-02 3 views
6

나는 두 개의 List<FileInfo>을 가지고 있는데 그들 사이에 공통적 인 FileItem을 반환하고 싶습니다.목록 건너 뛰기 Null을 반환합니다.

List<FileInfo> outputList = new List<FileInfo>(); 
outputList = list1.Intersect(list2).ToList(); 

그러나 빈 목록이 다시 나타납니다.

은 모두 목록

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder); 
IEnumerable<System.IO.FileInfo> fileList = 
dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories); 

에 의해 발견 및 쿼리에 의해 필터링 FileInfo 년대가 포함되어 있습니다.

+1

'FileInfo'는'Object.Equals'를 오버라이드하지 않기 때문에 다른 인스턴스가 동일하지 않을지라도 그들은 동일한 파일을 참조합니다. 비교를하기 위해서는 자신의'IEqualityComparer '을 제공해야합니다. – Lee

답변

6

FileInfoEquals/GetHashCode을 덮어 쓰지 않으므로 동일한 파일을 참조하더라도 두 개의 별개의 개체가 동일하지 않습니다. 세 가지 옵션 : FileInfo

  • IEqualityComparer<FileInfo>를 만들고 MoreLINQDistinctBy 같은 스타일에 IntersectBy를 구현하고 제안 Intersect
  • 에 그것을 통과 필요없는 경우

    • 이 경로에 목록을 변환 프로젝트에 대한 패치로서 :) (우리가 이미 가지고 있다고 생각했지만 분명히 ...)
  • +0

    정확하게이 OP의 상황과 [이 MSDN] (http://msdn.microsoft.com/en-us/library/bb546137.aspx) 문서의 IEqualityComparer 예제가 있습니다. – Bridge

    +0

    @Bridge : 글쎄,'IEqualityComparer' IMO의 "좋은"예제가 아닙니다. GetHashCode 구현은 불쾌합니다. ( –

    +0

    나는 단지 예제가 좋은 예라고 말했고, IEqualityComparer는 좋은 예! :-) – Bridge

    3

    참조 ~ FileInfo 두 목록의 개체가 다르기 때문에 Intersect은 빈 목록을 생성합니다.

    IEqualityComparer<FileInfo> 인터페이스를 구현하는 클래스를 만들고 예상 한 결과를 얻으려면이 클래스의 인스턴스를 Intersect으로 전달해야합니다.