2013-03-27 7 views
5

के बीच अंतर को खोजने के लिए मैं guids के 2 सूची है।कैसे 2 IEnumerable वस्तुओं

अब मैं उन सभी उपयोगकर्ता आईडी को ढूंढना चाहता हूं जो lscheckedUsers में नहीं हैं। 2.

मैं कैसे guids है कि दोनों में मौजूद नहीं है के अंतर मिलता है के बीच का अंतर

मैं निम्नलिखित ऊपर वास्तविक रिटर्न के

var userdifference = userids.Where(i => !lsCheckedUsers.Contains(lsCheckedUsers)); 
var userdifference = userids.Except(lsCheckedUsers); 

कोई भी कोशिश की है।

मुझे विश्वास है कि lsCheckedUsers GUIDs कि userids में हैं हूँ

+2

'lsCheckedUsers.Contains (lsCheckedUsers)' टिप्पणी बहुत ही दिलचस्प बयान है - निरंतर हो जाएगा ('FALSE' मुझे लगता है कि) हर समय ... –

+5

वहाँ एक कारण है कि आप प्रयोग कर रहे हैं' IEnumerable 'के बजाय' है IENumerable '? – itsme86

उत्तर

9

यह सही है:

var userdifference = userids.Except(lsCheckedUsers);

यदि आपका IEnumerable<dynamic> के दोनों वास्तव में Guids शामिल काम करेंगे। यह सुनिश्चित करने के लिए कि वे Guids हैं, प्रत्येक में आइटम प्रिंट या निरीक्षण करें।

आपको वास्तव में IEnumerable<Guid> का उपयोग करना चाहिए और आने वाली वस्तुओं को Guids पर डालना चाहिए यदि आप यही उम्मीद कर रहे हैं। यह उम्मीद है कि आप जिस तरह से संभावित रूप से देख रहे हैं उसकी तरह त्रुटियों को रोकें।!

+0

गतिशील वस्तुओं का उपयोग करते समय तुलना करना चाहिए जैसा कि करना चाहिए। मैंने प्रकारों को वास्तविक ग्रिड में बदल दिया और – user1526912

+0

@ user1526912: Hmmm, दिलचस्प काम किया। आंतरिक प्रकार वास्तव में 'गिड्स' हैं, तो यह निश्चित रूप से 'गतिशील' के रूप में कार्य करना चाहिए। मैंने इसे 'आईनेमेरेबल ' और 'आईनेमेरेबल ' (सरल परीक्षण - कुछ 'सूची ' के साथ कुछ मिलान और गैर मेलिंग 'ग्विड्स' के साथ परीक्षण किया)। मुझे आश्चर्य है कि क्या आपने उन्हें 'गिड्स' में कास्टिंग किया है, कुछ प्रकार के आंतरिक रूपांतरण ... –

1

आपके पास:

var userdifference = userids.Where(i => !lsCheckedUsers.Contains(lsCheckedUsers)); 

लेकिन मुझे लगता है तुम्हारा मतलब:

var userdifference = userids.Where(i => !lsCheckedUsers.Contains(i)); 

अद्यतन:

इन उत्तरों के कारण इन सभी को चिह्नित करने के लिए "संदर्भ" तुलना, मान लीजिए कि गुइड एक मूल्य प्रकार है, इसलिए इसकी समानता का मूल्यांकन अलग-अलग किया जाता है। अपने आप को मनाने के लिए इस सरल परीक्षण का प्रयास करें:

var guid = Guid.NewGuid(); 
var guids = new[] { new Guid(guid.ToString()) }; 

Console.WriteLine(guids.Contains(guid)); 

आप देखेंगे कि परिणाम सही है।

उन पंक्तियों के साथ
+0

यह केवल तभी काम करेगा जब वे एक ही संदर्भ हैं। दोनों सूचियां डेटाबेस से आबादी में हैं। –

+0

@VitorCanova यह सामान्य रूप से सच होगा, लेकिन Guid एक संरचना है और इसकी समानता का मूल्यांकन अलग तरीके से किया जाता है। इसे अपने लिए आज़माएं और देखें। – itsme86

+0

क्षमा करें। उस पर ध्यान नहीं दिया। आप गतिशील का उपयोग क्यों कर रहे हैं? –

2

कुछ ..

var difference = list1.Where (e => !list2.Any(a => a == e)) 
+0

अच्छा जवाब .... शास्त्रीय दृष्टिकोण .. !!!! : पी –

1

Enumerable विधि को छोड़कर एक

Enumerable.Except Method (IEnumerable, IEnumerable)

है और स्ट्रिंग या GUID का उपयोग करें।
यह बराबर के मानों की तुलना करेगा।

हैशसेट एक्सेप्ट के साथ शायद बेहतर प्रदर्शन होगा।
लेकिन यदि आपको डुप्लिकेट की अनुमति देने की आवश्यकता है तो हैशसेट का उपयोग नहीं कर सकता।

HashSet.ExceptWith Method

संबंधित मुद्दे