2012-08-02 56 views
6

我有两个List<FileInfo>,我想返回它们之间的通用FileItemList Intersect返回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 2012-08-02 12:16:20

回答

6

我怀疑FileInfo不会覆盖Equals/GetHashCode,所以即使它们引用同一个文件,两个不同的对象也是不相等的。三个选项:

  • 转换列表为路径,如果你不需要他们为FileInfo
  • 创建IEqualityComparer<FileInfo>并传递至Intersect
  • MoreLINQ实现IntersectBy在相同的风格DistinctBy并提出它作为该项目的补丁:)(我认为我们已经拥有了它,但显然不是......)
+0

在[此MSDN](http://msdn.microsoft.com/zh-cn/library/bb546137.aspx)文章中有一个OP的情况示例和'IEqualityComparer'示例。 – Bridge 2012-08-02 12:17:35

+0

@Bridge:好吧,它不是“IEqualityComparer”IMO的一个“好”例子 - 那个'GetHashCode'实现很讨厌:( – 2012-08-02 12:18:30

+0

我只是说这篇文章是一个很好的例子,我没有说'IEqualityComparer'是一个很好的例子好例子! :-) – Bridge 2012-08-02 12:20:06

3

参考FileInfo对象在你的两个列表中会有所不同,因此Intersect会产生一个空的列表。

您需要创建一个类来实现接口IEqualityComparer<FileInfo>并将此类的实例传递给Intersect以获得您期望的结果。