Question

I have two List<FileInfo> and I want to return the common FileItem between them.

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

However, I'm getting back an empty List.

Both the lists contain FileInfo's found by

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

And filtered by queries.

Was it helpful?

Solution

I suspect that FileInfo doesn't override Equals/GetHashCode, so two distinct objects will be unequal even if they refer to the same file. Three options:

  • Convert the lists to paths if you don't need them as FileInfo
  • Create an IEqualityComparer<FileInfo> and pass that to Intersect
  • Implement IntersectBy in the same style as DistinctBy in MoreLINQ and propose it as a patch to the project :) (I thought we already had it, but apparently not...)

OTHER TIPS

The references to the FileInfo objects in your two lists will be different, and therefore Intersect will produce an empty list.

You would need to create a class that implements the IEqualityComparer<FileInfo> interface and pass an instance of this class to Intersect in order to get the result you expect.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top