2012-08-02 20 views
6

Mam dwa List<FileInfo> i chcę zwrócić wspólną FileItem między nimi.Lista Przecięcie wraca null

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

Jednak wracam do pustej listy.

Oba wykazy zawierają FileInfo „s znaleźli

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

i filtrowane przez zapytaniami.

+1

'FileInfo' nie zastępuje' Object.Equals' więc różne instancje nie będą równe, nawet jeśli odnoszą się do tego samego pliku. Aby dokonać porównania, musisz podać własny "IEqualityComparer ". – Lee

Odpowiedz

6

Podejrzewam, że FileInfo nie zastępują Equals/GetHashCode, więc dwa odrębne obiekty będą nierówne, nawet jeśli odnoszą się one do tego samego pliku. Trzy opcje:

  • przekonwertować list do ścieżek czy nie trzeba ich jako FileInfo
  • Załóż IEqualityComparer<FileInfo> i przekazać, że do Intersect
  • Wdrożenie IntersectBy w tym samym stylu co DistinctBy w MoreLINQ i zaproponować go jako poprawkę do projektu :) (Myślałem, że już to mamy, ale najwyraźniej nie ...)
+0

Istnieje przykład dokładnie sytuacji OP i przykładowego "IEqualityComparer" w [tym MSDN] (http://msdn.microsoft.com/en-us/library/bb546137.aspx) artykuł. – Bridge

+0

@Bridge: Cóż, nie jest to "dobry" przykład 'IEqualityComparer' IMO - że implementacja' GetHashCode' jest nieprzyjemna :( –

+0

Miałem tylko na myśli, że artykuł był dobrym przykładem, nie powiedziałem, że 'IEqualityComparer' był dobry przykład! :-) – Bridge

3

Obiekty o numerachna obu listach będą różne, dlatego też Intersect spowoduje utworzenie pustej listy.

Należy utworzyć klasę, która implementuje interfejs IEqualityComparer<FileInfo> i przekazać instancję tej klasy do Intersect, aby uzyskać oczekiwany rezultat.