2012-08-02 11 views
6

Tengo dos List<FileInfo> y quiero devolver el FileItem común entre ellos.List Intersect return null

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

Sin embargo, estoy obteniendo una lista vacía.

Tanto las listas contienen FileInfo 's encontrados por

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

y se filtra por las consultas.

+1

'FileInfo' no anula' Object.Equals' por lo que las diferentes instancias no serán iguales, incluso si se refieren al mismo archivo. Deberá proporcionar su propio 'IEqualityComparer ' para hacer la comparación. – Lee

Respuesta

6

Sospecho que FileInfo no anula Equals/GetHashCode, por lo que dos objetos distintos serán desiguales aunque se refieran al mismo archivo. Hay tres opciones:

  • convertir las listas de caminos si no los necesita como FileInfo
  • Crear IEqualityComparer<FileInfo> y pasar a que Intersect
  • IntersectBy Implementar en el mismo estilo que DistinctBy en MoreLINQ y propóngalo como un parche para el proyecto :) (Pensé que ya lo teníamos, pero aparentemente no ...)
+0

Hay un ejemplo de la situación exacta de OP y un ejemplo 'IEqualityComparer' en [este MSDN] (http://msdn.microsoft.com/en-us/library/bb546137.aspx) artículo. – Bridge

+0

@Bridge: Bueno, no es un "buen" ejemplo de 'IEqualityComparer' IMO - esa implementación de 'GetHashCode' es desagradable :( –

+0

Solo quise decir que el artículo era un buen ejemplo, no dije que el' IEqualityComparer' fuera un ¡buen ejemplo! :-) – Bridge

3

Las referencias a los FileInfo los objetos de las dos listas serán diferentes, y por lo tanto Intersect producirán una lista vacía.

Debería crear una clase que implemente la interfaz IEqualityComparer<FileInfo> y pasar una instancia de esta clase a Intersect para obtener el resultado que espera.

Cuestiones relacionadas