2010-04-26 23 views
7

किसी भी तरह से मुझे काम करने के लिए सी # में फ़ोरैच लूप के भीतर स्ट्रिंग प्रतिस्थापन नहीं मिल रहा है। मेरे कोड इस प्रकार है:सी # स्ट्रिंग लूप 0 स्ट्रिंग लूप 0 स्ट्रिंग लूप

foreach (string s in names) 
{ 
    s.Replace("pdf", "txt"); 
} 

Am अभी भी काफी LINQ करने के लिए नए तो मुझे क्षमा अगर यह शौकिया लगता है;) सी # में

उत्तर

30

आप कहते हैं कि आप एक LINQ समाधान के बाद कर रहे हैं ... कि आसान है:

var replacedNames = names.Select(x => x.Replace("pdf", "txt")); 

हम names के प्रकार पता नहीं है, लेकिन आप इसे वापस करने के लिए प्रदान करना चाहते हैं, तो आप संभावित ToArray या ToList इस्तेमाल कर सकते हैं:

// If names is a List<T> 
names = names.Select(x => x.Replace("pdf", "txt")).ToList(); 
// If names is an array 
names = names.Select(x => x.Replace("pdf", "txt")).ToArray(); 

आपको यह जानकारी होनी चाहिए कि कोड है कि आप पोस्ट किया है सब पर पल हालांकि पर LINQ का उपयोग नहीं कर रहा है ...

21

स्ट्रिंग्स अपरिवर्तनीय हैं (परिवर्तन नहीं करता है), इसलिए s.Replace एक नया स्ट्रिंग वापस आ जाएगी । दुर्भाग्य से इसका मतलब है कि आप अपडेट करने के लिए foreach का उपयोग नहीं कर सकते हैं। नाम एक सरणी है अगर यह काम करना चाहिए:

for(int i = 0; i < names.Length; i++) 
{ 
    names[i] = names[i].Replace("pdf", "txt"); 
} 
+2

यह एक ' सूची' भी के लिए काम करेंगे। बस _Count_ –

0

s.Replace एक समारोह है ताकि आप रों चाहते हैं .. = s.Replace(), हालांकि यह StringBuilder उपयोग करने के लिए बेहतर है। (ऊपरी उत्तर देखें)

+4

के साथ _Length_ को प्रतिस्थापित करें स्ट्रिंगबिल्डर का उपयोग क्यों बेहतर होगा? ऐसा नहीं है * एकाधिक * स्ट्रिंग पर एकाधिक प्रतिस्थापन किए जा रहे हैं। –

3

जैसा कि अन्य ने उल्लेख किया है कि आपको यह जगह करने के लिए for लूप का उपयोग करने की आवश्यकता होगी। हालांकि, अगर आपको ऑपरेशन करने की आवश्यकता नहीं है (यानी परिणाम एक अलग संग्रह हो सकते हैं), तो आप इसे एक linq क्वेरी के रूप में भी कर सकते हैं, उदा।

var results = from name in names select name.Replace("pdf", "txt"); 

हालांकि एक बात - ऐसा लगता है कि आप कुछ फ़ाइल नामों का विस्तार बदलने की कोशिश कर रहे हैं। यदि आप यही करने की कोशिश कर रहे हैं तो मैं Path.ChangeExtension की सिफारिश करता हूं जो विशेष रूप से इस उद्देश्य के लिए डिज़ाइन किया गया है।

var results = from name in names select Path.ChangeExtension(name, "txt"); 
+1

यहां एक क्वेरी अभिव्यक्ति का उपयोग करना ओवरकिल लगता है - यदि आप केवल एक ही चयन कर रहे हैं, तो इसे सीधे क्यों नहीं बुलाएं? Path.ChangeExtension के लिए +1 हालांकि। –

+0

@ जोन - मुझे लगता है कि क्वेरी एक्सप्रेशन अच्छे दिखते हैं और पढ़ने के लिए थोड़ा आसान हैं। यह सब एक ही कोड पर संकलित होते हैं, और कुछ अतिरिक्त वर्ण टाइप करने से मुझे वास्तव में परेशान नहीं होता है। अगर मैं ऐसा कुछ कर रहा था जिसे किसी प्रश्न में व्यक्त नहीं किया जा सकता है जैसे कि स्किप/ले या किसी सूची में कनवर्ट करना, तो शायद मैं विस्तार विधियों का सीधे उपयोग करूँगा। –

+0

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

-1

प्रतिस्थापन का उपयोग क्यों करें, इससे एप्लिकेशन धीमा हो जाएगा। उपयोग regex:

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.replace.aspx

+1

इन लोगों के अनुसार परीक्षण नहीं: http://blogs.msdn.com/b/debuggingtoolbox/archive/2008/04/02/comparing-regex-replace-string-replace-and-stringbuilder-replace-which-has- बेहतर performance.aspx – grmbl