2015-12-20 2 views
13

कोड पर एक नज़र डालें:क्वेरी परिणाम में एक वर्ण क्यों गुम है?

string expression = "x & ~y -> (s + t) & z"; 
var exprCharsNoWhitespace = expression.Except(new[]{' ', '\t'}).ToList(); 
var exprCharsNoWhitespace_2 = expression.Replace(" ", "").Replace("\t", "").ToList(); 

// output for examination 
Console.WriteLine(exprCharsNoWhitespace.Aggregate("", (a,x) => a+x)); 
Console.WriteLine(exprCharsNoWhitespace_2.Aggregate("", (a,x) => a+x)); 

// Output: 
// x&~y->(s+t)z 
// x&~y->(s+t)&z 

मैं मूल स्ट्रिंग से सभी सफेद स्थान को निकालना और फिर अलग-अलग पात्रों प्राप्त करना चाहते हैं। परिणाम मुझे surprized। परिवर्तनीय exprCharsNoWhitespace में अपेक्षित, कोई सफेद जगह नहीं है, लेकिन अप्रत्याशित रूप से, केवल लगभग अन्य सभी वर्ण शामिल हैं। '&' का आखिरी मौका गायब है, सूची की गणना 12 है। जबकि exprCharsNoWhitespace_2 पूरी तरह से अपेक्षित है: गणना 13 है, व्हाइटस्पेस के अलावा अन्य सभी वर्ण निहित हैं।

उपयोग किया गया ढांचा .NET 4.0 था। मैंने इसे csharppad (वेब-आधारित आईडीई/कंपाइलर) पर भी चिपकाया और उसी परिणाम प्राप्त किए।

ऐसा क्यों होता है?


संपादित: Allright, मैं अनजान था कि है के अलावा, के रूप में रयान ओ'हारा, एक सेट आपरेशन द्वारा बताया। मैंने पहले इसका इस्तेमाल नहीं किया था।

// So I'll continue just using something like this: 
expression.Where(c => c!=' ' && c!='\t') 

// or for more characters this can be shorter: 
expression.Where(c => ! new[]{'a', 'b', 'c', 'd'}.Contains(c)). 

उत्तर

18

Except produces a set difference. आपका अभिव्यक्ति एक सेट नहीं है, तो यह सही विधि का उपयोग करने के लिए नहीं है। क्यों & विशेष रूप से गायब है: ऐसा इसलिए है क्योंकि यह दोहराया गया है। अन्य पात्रों में से कोई भी नहीं है।

+2

डी 'ओह! मैं इस विधि के पहलू से अनजान था। – user1847129

+0

वाह, यह भयानक नामकरण है। मैंने कभी इसकी उम्मीद नहीं की होगी। – Mehrdad

+0

@ मेहरदाद - मैं उत्सुक हूं कि आप नामकरण को ठीक करने के लिए क्या करेंगे? संख्यात्मक में कई "सेट-आधारित" विधियां हैं और वे परंपरागत सेट शब्दावली का उपयोग करते हैं - अंतर, संघ, छोड़कर। –

4

रयान ने पहले से ही आपके प्रश्न का उत्तर दिया है, लेकिन मैं आपको जिस समस्या का सामना कर रहा हूं उसका वैकल्पिक समाधान प्रदान करना चाहता हूं। यदि आपको बहुत सी स्ट्रिंग मैनिपुलेशन करने की आवश्यकता है, तो आपको उपयोगी होने के लिए नियमित अभिव्यक्ति पैटर्न मिलान मिल सकता है। उदाहरण आपके द्वारा दिए गए कुछ इस तरह काम करेगा:

string expression = "x & ~y -> (s + t) & z"; 
string pattern = @"\s"; 
string replacement = ""; 
string noWhitespace = new Regex(pattern).Replace(expression, replacement); 

या दूसरे उदाहरण के लिए, सब कुछ पैटर्न को छोड़कर एक ही रखें:

string pattern = "[abcd]"; 

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

3

जैसा कि पहले से ही उल्लेख किया गया है .Except(...) एक सेट ऑपरेशन है, इसलिए यह डुप्लिकेट छोड़ देता है।

सिर्फ बजाय .Where(...) उपयोग करके देखें:

string expression = "x & ~y -> (s + t) & z"; 
var exprCharsNoWhitespace = 
    String.Join(
     "", 
     expression.Where(c => !new[] { ' ', '\t' }.Contains(c))); 

यह देता है:

x&~y->(s+t)&z 
संबंधित मुद्दे