2011-02-05 10 views
69

हर किसी को नमस्कार ... मुझे TrimString की आवश्यकता है। लेकिन मैं स्ट्रिंग के भीतर सभी बार-बार खाली रिक्त स्थान को हटाना चाहता हूं, न केवल अंत में या इसकी शुरुआत में। मैं की तरह एक विधि के साथ यह कर सकता है:सी # बिल्ट-इन प्रकारों का विस्तार कैसे करें, जैसे स्ट्रिंग?

public static string ConvertWhitespacesToSingleSpaces(string value) 
{ 
    value = Regex.Replace(value, @"\s+", " "); 
} 

कौन सा मैं here से मिला है। लेकिन मैं चाहता हूं कि कोड का यह टुकड़ा String.Trim() के भीतर ही बुलाया जाए, इसलिए मुझे लगता है कि मुझे Trim विधि को विस्तारित या अधिभारित करने या ओवरराइड करने की आवश्यकता है ... क्या ऐसा करने का कोई तरीका है?

अग्रिम धन्यवाद।

उत्तर

118

चूंकि आप string.Trim() का विस्तार नहीं कर सकते हैं। आप here वर्णित एक विस्तार विधि बना सकते हैं जो trims और सफेद जगह कम कर देता है।

namespace CustomExtensions 
{ 
    //Extension methods must be defined in a static class 
    public static class StringExtension 
    { 
     // This is the extension method. 
     // The first parameter takes the "this" modifier 
     // and specifies the type for which the method is defined. 
     public static string TrimAndReduce(this string str) 
     { 
      return ConvertWhitespacesToSingleSpaces(str).Trim(); 
     } 

     public static string ConvertWhitespacesToSingleSpaces(this string value) 
     { 
      return Regex.Replace(value, @"\s+", " "); 
     } 
    } 
} 

तुम इतनी

using CustomExtensions; 

string text = " I'm wearing the cheese. It isn't wearing me! "; 
text = text.TrimAndReduce(); 

की तरह उपयोग कर सकते हैं

text = "I'm wearing the cheese. It isn't wearing me!"; 
+0

क्या फ़ाइल को एक विशेष नाम की आवश्यकता है? या आप इसे कहां से बचाते हैं? क्या इसे एक यूटिल क्लास या ऐसा कुछ में रखा जा सकता है? – testing

+1

@testing आप उन्हें तब तक कहीं भी रख सकते हैं जब तक कि वे आपके प्रोजेक्ट में संदर्भित हों। यदि आप उन्हें एक विशिष्ट नामस्थान में डालते हैं, तो उन्हें किसी भी अन्य वर्ग की तरह 'उपयोग' कथन के साथ लाएं। – Twicetimes

+0

आपने TrimAndReduce फ़ंक्शन से सीधे रेगेक्स क्यों नहीं लौटाया? यह आपके उत्तर को पढ़ने के लिए बहुत आसान बना दिया होगा।जब तक आप अपने उत्तर का इतना उपयोग नहीं करते हैं कि आपको उस अन्य जगह को कॉल करने की आवश्यकता है – quemeful

20

क्या यह संभव है? हां, लेकिन केवल एक विस्तार विधि

कक्षा System.String को सील कर दिया गया है ताकि आप ओवरराइडिंग या विरासत का उपयोग न कर सकें।

public static class MyStringExtensions 
{ 
    public static string ConvertWhitespacesToSingleSpaces(this string value) 
    { 
    return Regex.Replace(value, @"\s+", " "); 
    } 
} 

// usage: 
string s = "test !"; 
s = s.ConvertWhitespacesToSingleSpaces(); 
+5

स्पष्ट होने के लिए, नहीं, 'स्ट्रिंग.Trim' लेने वाले कार्यों को संशोधित करना संभव नहीं है। –

7

Extension methods!

public static class MyExtensions 
{ 
    public static string ConvertWhitespacesToSingleSpaces(this string value) 
    { 
     return Regex.Replace(value, @"\s+", " "); 
    } 
} 
9

एक हाँ और एक नहीं अपने प्रश्न का नहीं है।

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

public static string ConvertWhitespacesToSingleSpaces(this string value) {...} 

// some time later... 
"hello world".ConvertWhitespacesToSingleSpaces() 

नहीं, आप इस विधि को ट्रिम() नहीं कह सकते हैं। विस्तार विधियां ओवरलोडिंग में भाग नहीं लेती हैं। मुझे लगता है कि एक कंपाइलर आपको यह विवरण देने में एक त्रुटि संदेश भी देना चाहिए।

विस्तार विधियां केवल तभी दिखाई देती हैं जब विधि को परिभाषित करने वाले प्रकार वाले नामस्थान का उपयोग किया जाता है।

2

देता विस्तार तरीकों का उपयोग कर इसके अलावा - संभावना एक अच्छे उम्मीदवार यहाँ - यह भी संभव है "रैप" करने के लिए एक वस्तु (उदाहरण के लिए "ऑब्जेक्ट संरचना")। जब तक लिपटे रूप में लपेटने वाली चीज़ की तुलना में कोई और जानकारी नहीं होती है तब तक लपेटा हुआ आइटम स्पष्ट रूप से अंतर्निहित या स्पष्ट रूपांतरणों के माध्यम से जानकारी के नुकसान के बिना पारित किया जा सकता है: केवल प्रकार/इंटरफ़ेस का परिवर्तन।

हैप्पी कोडिंग।

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