LINQ का उपयोग करके निम्न स्थिति में सभी स्ट्रिंग को सूची <string> में कैसे परिवर्तित करें?


94

मैंने स्टाकेवरफ्लो पर यहाँ प्रतिक्रियाओं में से एक में कल एक कोड स्निपेट देखा था जिसने मुझे गुदगुदाया। यह कुछ इस तरह था:

 List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"};

 myList.ForEach(d=>d.ToLower());

मैं उम्मीद कर रहा था कि मैं इसका उपयोग अपने सभी सामानों को लोअरकेस में बदलने के लिए कर सकता हूं। हालाँकि, ऐसा नहीं होता है ... इसे चलाने के बाद, MyList में आवरण अपरिवर्तित होता है।

तो मेरा सवाल यह है कि क्या कोई ऐसा तरीका है, जिससे लिनक्यू और लैंबडा एक्सप्रेशंस का उपयोग आसानी से हो सके और किसी सूची की सामग्री को इस तरह से संशोधित किया जा सके।

धन्यवाद, मैक्स

जवाबों:


181

सबसे आसान तरीका:

myList = myList.ConvertAll(d => d.ToLower());

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


4
विस्तार विधि नहीं।
लीपी

@ इलेप्पी: सच, यह अच्छी पकड़ नहीं है। इस मामले में, इस बारे में चिंता करना कि क्या यह एक इंस्टेंस विधि है या एक विस्तार विधि थोड़ा पांडित्यपूर्ण हो सकती है, लेकिन यह निश्चित रूप से सटीक है। :)
जेसन बंटिंग

और स्ट्रिंग अपरिवर्तनीय है: पी
शर्लक

48

ऐसा इसलिए है क्योंकि ToLower मूल स्ट्रिंग को परिवर्तित करने के बजाय एक लोअरकेस स्ट्रिंग लौटाता है। तो आप कुछ इस तरह चाहते हैं:

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();

1
मुझे यह स्वीकार किए गए उत्तर की तुलना में बेहतर लगता है क्योंकि आप इसे किसी भी IEnumerable <string> के साथ उपयोग कर सकते हैं, न कि केवल सूची <string>।
जोशुआ पेच

6
यह समाधान .NET कोर में भी काम करता है। ConvertAll .NET कोर में मौजूद नहीं है।
जोनास

3
[TestMethod]
public void LinqStringTest()
{
    List<string> myList = new List<string> { "aBc", "HELLO", "GoodBye" };
    myList = (from s in myList select s.ToLower()).ToList();
    Assert.AreEqual(myList[0], "abc");
    Assert.AreEqual(myList[1], "hello");
    Assert.AreEqual(myList[2], "goodbye");
}

3

ForEachउपयोग करता है Action<T>, जिसका अर्थ है कि xअगर आप अपरिवर्तनीय नहीं थे, तो आप इसे प्रभावित कर सकते हैं । चूंकि xयह एक है string, यह अपरिवर्तनीय है, इसलिए आप इसे लैम्ब्डा में कुछ भी नहीं करते हैं, इसके गुणों को बदल देगा। Kyralessa का समाधान आपका सबसे अच्छा विकल्प है जब तक कि आप अपनी खुद की विस्तार विधि को लागू नहीं करना चाहते हैं जो आपको एक प्रतिस्थापन मूल्य वापस करने की अनुमति देता है।


कृपया और अधिक शोध करें यदि आप निश्चित नहीं हैं ... कुछ याद रखें?
पैट्रिक डेसजार्डिन्स

त्रुटि मानवीय है, मैंने जो लिंक प्रदान किया था उसमें बोल्ड में 3.5 और सामान्य में 2.0 था, मैंने इसे नहीं देखा है। मैंने अपनी पोस्ट हटा दी है ... आपकी एक साधारण टिप्पणी पर्याप्त होती। आप बिना किसी कारण के नीचा दिखाना चाहते हैं, अब मान लेते हैं।
पैट्रिक डेसजार्डिन्स

हालाँकि मैं इसे लगभग एक साल बाद लिख रहा हूँ, और हालाँकि मैं डॉक नहीं हूँ, फिर भी मैं आपको बताऊँगा कि आपका उत्तर "गलत" क्यों है - आपने कहा कि "Kyralessa का समाधान आपका सबसे अच्छा विकल्प है" जब यह नहीं है - मेरा समाधान क्लीनर है और साफ।
जेसन बंटिंग

-1
var _reps = new List(); // with variant data

_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.