2011-05-21 18 views
20

वस्तुओं के लिए LINQ स्ट्रिंग वस्तुओं पर प्रश्नों का समर्थन करता है लेकिन जब मैं इस तरह के नीचे के रूप में कोड का उपयोग करें:स्ट्रिंग पर 'टेक() `कैसे करें और अंत में एक स्ट्रिंग प्राप्त करें?

string SomeText = "this is some text in a string"; 
return SomeText.Take(6).ToString(); 

सभी मैं मिलता है:

System.Linq.Enumerable+<TakeIterator>d__3a`1[System.Char] 

यह this question में एक "दुर्घटना" के रूप में चर्चा की है, लेकिन इस मैं वास्तव में क्या करने की कोशिश कर रहा हूं और मुझे इसे कहीं भी खोज के माध्यम से नहीं मिल रहा है।

मुझे पता है कि स्ट्रिंग में हेरफेर करने के अन्य तरीके हैं, लेकिन मुझे यह भी पता है कि आप LINQ के साथ कुछ वाकई अच्छी चाल कर सकते हैं और मैं सिर्फ यह जानना चाहता हूं कि LINQ के साथ एक निश्चित लंबाई तक स्ट्रिंग को ट्रिम करने का कोई तरीका है या नहीं?

उत्तर

18

कोई System.Linq करने के लिए बनाया यह करने के लिए विधि नहीं है, लेकिन आप काफी आसानी से अपने खुद के विस्तार विधि लिख सकते हैं:

public static class StringExtensions 
{ 
    public static string ToSystemString(this IEnumerable<char> source) 
    { 
     return new string(source.ToArray()); 
    } 
} 

दुर्भाग्य से, क्योंकि object.ToString सभी .NET वस्तुओं पर मौजूद है, आप करने के लिए होगा विधि को एक अलग नाम दें ताकि संकलक आपकी विस्तार विधि का आह्वान करेगा, न कि अंतर्निहित ToString

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

/// <summary> 
/// Truncates a string to a maximum length. 
/// </summary> 
/// <param name="value">The string to truncate.</param> 
/// <param name="length">The maximum length of the returned string.</param> 
/// <returns>The input string, truncated to <paramref name="length"/> characters.</returns> 
public static string Truncate(this string value, int length) 
{ 
    if (value == null) 
     throw new ArgumentNullException("value"); 
    return value.Length <= length ? value : value.Substring(0, length); 
} 

आप इसका इस्तेमाल देंगी:

string SomeText = "this is some text in a string"; 
return SomeText.Truncate(6); 

इस का लाभ दिया है स्ट्रिंग पहले से वांछित लंबाई से कम होने पर कोई अस्थायी सरणी/ऑब्जेक्ट नहीं बना रहा है।

+0

धन्यवाद। और यह चीजों को करने का एक "ठीक" तरीका है? एक बड़ी प्रणाली का यह हिस्सा जहां मैं एक स्ट्रिंगबिल्डर के चारों ओर गुजर रहा हूं और फ़ाइल उत्पन्न करने के लिए बहुत सारे डेटा को एपेंड() 'कर रहा हूं। मुझे पता है कि मुझे समय-समय पर अनुकूलन नहीं करना चाहिए, लेकिन जब आप ऐसा करने का एक आसान तरीका रखते हैं तो सीपीयू/मेमोरी बर्बाद करने के सुझाव में LINQ का उपयोग कर रहे हैं? बस रखें: क्या आप इस कोड का उपयोग स्ट्रिंग को अपनी खुद की परियोजना में एक निश्चित लंबाई तक ट्रिम करने के लिए करेंगे? – rtpHarry

+1

@rtpHarry अच्छा सवाल; मैं व्यक्तिगत रूप से इसे पूरा करने के लिए LINQ का उपयोग नहीं करता, और जिस दृष्टिकोण को मैं चुनूंगा उसके साथ अपना उत्तर अपडेट कर दूंगा। –

+0

आपकी अतिरिक्त प्रतिक्रिया के लिए धन्यवाद, मैं इस पर आधारित अपने कोड को अपडेट करूंगा :) – rtpHarry

15

बस स्ट्रिंग

string res = new string(SomeText.Take(6).ToArray()); 

इसके अलावा स्ट्रिंग पर ध्यान देना देशी तरीकों

बनाने
string res = SomeText.Substring(0, 6); 
+1

'कुछ टेक्स्ट' छः वर्णों से छोटा है तो सबस्ट्रिंग फेंक देगा; मैंने माना कि ओपी एक विधि चाहता था जो 'टेक' की तरह व्यवहार करे (यानी।, इनपुट स्ट्रिंग कम होने पर, अधिकांश वर्णों पर लौटाता है, लेकिन कम (बिना अपवाद के)। –

3

SomeText.Take(6) इच्छा रिटर्न चार के चार में से एक IEnumerable, और ToString विधि संदिग्ध स्ट्रिंग आप की जरूरत नहीं लौटेगा इसे निम्न की तरह कॉल करें:

string [] array = SomeText.Take(6).ToArray(); 
string result = new string(array); 
6

मैंने इसे अपने आप में कुछ बार चलाया है और निम्नलिखित का उपयोग किया है:

string.Join(string.Empty,yourString.Take(5));