2012-08-02 22 views
6

私は2つのList<FileInfo>を持っていて、それらの間に共通のFileItemを返したいと思います。リストを返すIntersect null 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

答えて

6

FileInfoEquals/GetHashCodeをオーバーライドしないと考えられます。したがって、2つの異なるオブジェクトは同じファイルを参照しても不均等になります。 3つのオプション:あなたはIEqualityComparer<FileInfo>を作成し、MoreLINQDistinctByと同じスタイルでIntersectByを実装し、それを提案Intersect

  • にそれを渡すFileInfo
  • として、それらを必要としない場合

    • パスにリストを変換します(私は既にそれを持っていたと思ったが、明らかにそうではないと思った...)
  • +0

    正確なOPの状況の例と[このMSDN](http://msdn.microsoft.com/en-us/library/bb546137.aspx)の記事のIEqualityComparerの例があります。 – Bridge

    +0

    @Bridge:「IEqualityComparer」の「良い」例ではありません。「GetHashCode」の実装は厄介です:( –

    +0

    私はその記事が良い例であることを意味しました。私は 'IEqualityComparer'が良い例え! :-) – Bridge

    3

    参照FileInfoの2つのリストのオブジェクトは異なるため、Intersectは空のリストを生成します。

    IEqualityComparer<FileInfo>インターフェイスを実装するクラスを作成し、期待する結果を得るには、このクラスのインスタンスをIntersectに渡す必要があります。