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);