C# 列表交集返回空值

C# 列表交集返回空值,c#,linq,list,fileinfo,intersect,C#,Linq,List,Fileinfo,Intersect,我有两个列表,我想返回它们之间的公共文件项 List<FileInfo> outputList = new List<FileInfo>(); outputList = list1.Intersect(list2).ToList(); 并通过查询进行筛选。对两个列表中的FileInfo对象的引用将不同,因此Intersect将生成一个空列表 您需要创建一个实现该接口的类,并将该类的一个实例传递给Intersect,以获得您期望的结果。我怀疑FileInfo没有覆盖Equ

我有两个
列表
,我想返回它们之间的公共
文件项

List<FileInfo> outputList = new List<FileInfo>();
outputList = list1.Intersect(list2).ToList();
并通过查询进行筛选。

对两个列表中的
FileInfo
对象的引用将不同,因此
Intersect
将生成一个空列表


您需要创建一个实现该接口的类,并将该类的一个实例传递给
Intersect
,以获得您期望的结果。

我怀疑
FileInfo
没有覆盖
Equals
/
GetHashCode
,因此,即使两个不同的对象引用同一个文件,它们也是不相等的。三种选择:

  • 如果不需要将列表作为
    FileInfo
  • 创建一个
    IEqualityComparer
    并将其传递给
    Intersect
  • 以与中的
    DistinctBy
    相同的风格实施
    IntersectBy
    ,并将其作为项目的补丁提出:)(我认为我们已经有了它,但显然没有……)

FileInfo
不会覆盖
对象。Equals
,因此不同实例即使引用同一文件也不会相等。您必须提供自己的
IEqualityComparer
来进行比较。这篇文章中有一个例子正好说明了OP的情况,还有一个例子
IEqualityComparer
。@Bridge:嗯,这不是
IEqualityComparer
IMO的“好”例子-
GetHashCode
实现很糟糕:(我只是说这篇文章是个好例子,我没有说
IEqualityComparer
是个好例子!:-)
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder);
IEnumerable<System.IO.FileInfo> fileList = 
dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories);