2012-08-02 24 views
6

मेरे पास दो List<FileInfo> हैं और मैं उनके बीच सामान्य FileItem वापस करना चाहता हूं।सूची छेड़छाड़ वापसी शून्य

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

हालांकि, मैं एक खाली सूची वापस प्राप्त कर रहा हूं।

दोनों सूचियों FileInfo के द्वारा

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

पाया और प्रश्नों द्वारा फ़िल्टर होते हैं। अपने दो सूचियों में

+1

'' FileInfo' पर हावी नहीं होता Object.Equals' इसलिए अलग-अलग विविधताएं भले ही बराबर नहीं होगा वे एक ही फाइल का संदर्भ लें। तुलना करने के लिए आपको अपनी खुद की 'IEqualityComparer ' प्रदान करना होगा। – Lee

उत्तर

6

मुझे संदेह है कि FileInfoEquals/GetHashCode ओवरराइड नहीं करता है, इसलिए दो अलग-अलग वस्तुएं असमान होंगी, भले ही वे एक ही फ़ाइल का संदर्भ लें। तीन विकल्प:

  • अगर तुम उन्हें जरूरत नहीं है के रूप में FileInfo
  • एक IEqualityComparer<FileInfo> बनाएँ और MoreLINQ में DistinctBy रूप में एक ही शैली में IntersectBy लागू है और यह प्रस्ताव Intersect
  • है कि पारित पथ में बदलें सूचियों परियोजना :) करने के लिए एक पैच के रूप में (मैंने सोचा था कि हम पहले से ही यह किया था, लेकिन जाहिरा तौर पर नहीं ...)
+0

बिल्कुल ओपी की स्थिति का उदाहरण है और [आईएसडीएन] पर एक उदाहरण 'आईक्वालिटी कॉम्पैयर' (http://msdn.microsoft.com/en-us/library/bb546137.aspx) आलेख है। – Bridge

+0

@ ब्रिज: ठीक है, यह 'IEqualityComparer' IMO का" अच्छा "उदाहरण नहीं है - कि 'GetHashCode' कार्यान्वयन बुरा है :( –

+0

मेरा मतलब केवल यह लेख एक अच्छा उदाहरण था, मैंने नहीं कहा कि' IEqualityComparer' था अच्छा उदाहरण! :-) – Bridge

3

संदर्भFileInfo वस्तुओं के लिए अलग-अलग होगा, और इसलिए Intersect एक खाली सूची का उत्पादन करेगा।

आपको उस श्रेणी को बनाने की आवश्यकता होगी जो IEqualityComparer<FileInfo> इंटरफ़ेस लागू करता है और परिणाम प्राप्त करने के लिए इस कक्षा का उदाहरण Intersect पर पास करता है।