2009-03-21 15 views
5

क्या कोई यह समझा सकता है कि यह ऐसा क्यों नहीं करता है जैसा मुझे लगता है कि इसे करना चाहिए।संख्यात्मक। समस्या को छोड़कर

double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.3, 2.3, 2.4, 2.5 }; 
double[] numbers2 = { 2.2 }; 

IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2); 

foreach (double number in onlyInFirstSet) 
    Console.WriteLine(number); 

/* 
This code produces the following output: 

2 
2.1 
2.3 
2.4 
2.5 
*/ 

मैं क्या उम्मीद करेंगे 2, 2.1, 2.3, 2.3, 2.3, 2.4, 2.5 है। एक अलग सूची वापस छोड़कर क्यों? क्या यह एक बग है?

अद्यतन:

ठीक है, पूरी तरह से डॉक्स में उस बिंदु याद किया। मजेदार 4 लोग एक ही जवाब के साथ जवाब देते हैं। आपको लगता है कि आप उस व्यक्ति को वोट देंगे जो पहले इसका जवाब दे रहा था। :)

+0

@ जेम्स: मैंने जो कुछ भी आप चाहते हैं उसे करने का एक तरीका जोड़ा है, बीटीडब्ल्यू, जो मैंने पाया है, शायद यह आपके लिए अधिक उपयोगी है "नहीं, यह उस तरह से काम नहीं करता है"। ;) –

+0

बहुत बहुत धन्यवाद। मैं अगले से पूछने जा रहा था लेकिन तुमने मुझे भी मार दिया। आपको अतिरिक्त ब्राउनी पॉइंट देने का कोई तरीका नहीं है लेकिन धन्यवाद। –

+0

यह ठीक है। मेरे दोस्त ने मुझे ब्राउनी बना दिया, इसलिए मैं भरा हुआ हूँ! ;) –

उत्तर

8

एक अलग सूची को छोड़कर क्यों क्यों होगा? क्या यह एक बग है?

नहीं। Exceptसेट अंतर बनाता है।

मूल्यों की तुलना करने के लिए डिफ़ॉल्ट समानता comparer का उपयोग करके दो दृश्यों के सेट अंतर का उत्पादन: documentation देखें।

जो कुछ आप चाहते हैं उसे करने के लिए, मूल्यों को उचित रूप से फ़िल्टर करने के लिए बस Where का उपयोग करें। उदाहरण के लिए:

"abcdddefffg".Where(e => !"cde".Contains(e));  // Produces "abfffg". 
1

यह वास्तव में सही व्यवहार है। Except विधि को दो IENumerable तर्कों के अंतर सेट करने के लिए प्रलेखित किया गया है। परिभाषा के अनुसार, सेट में डुप्लिकेट तत्व नहीं हो सकते हैं, परिणामस्वरूप इन्हें समाप्त कर दिया गया है। अधिक जानकारी के लिए MSDN docs देखें।

1

क्योंकि "छोड़कर" एक "सेट" फ़ंक्शन है, और "सेट" की अवधारणा को वस्तुओं की एक अद्वितीय सूची के रूप में परिभाषित किया गया है। दूसरे शब्दों में, परिभाषा के अनुसार सेट में डुप्लीकेट नहीं हो सकते हैं।

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