How to Convert all strings in List<string> to lower case using LINQ?

C#LinqLambdaForeach

C# Problem Overview


I saw a code snippet yesterday in one of the responses here on StackOverflow that intrigued me. It was something like this:

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

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

I was hoping I could use it to convert all items in myList to lowercase. However, it doesn't happen... after running this, the casing in myList is unchanged.

So my question is whether there IS a way, using LINQ and Lambda expressions to easily iterate through and modify the contents of a list in a manner similar to this.

Thanks, Max

C# Solutions


Solution 1 - C#

Easiest approach:

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

Not too much different than your example code. ForEach loops the original list whereas ConvertAll creates a new one which you need to reassign.

Solution 2 - C#

That's because ToLower returns a lowercase string rather than converting the original string. So you'd want something like this:

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

Solution 3 - C#

ForEach uses Action<T>, which means that you could affect x if it were not immutable. Since x is a string, it is immutable, so nothing you do to it in the lambda will change its properties. Kyralessa's solution is your best option unless you want to implement your own extension method that allows you to return a replacement value.

Solution 4 - C#

[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");
}

Solution 5 - C#

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

_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMax SchillingView Question on Stackoverflow
Solution 1 - C#Jason BuntingView Answer on Stackoverflow
Solution 2 - C#Ryan LundyView Answer on Stackoverflow
Solution 3 - C#Michael MeadowsView Answer on Stackoverflow
Solution 4 - C#marcumkaView Answer on Stackoverflow
Solution 5 - C#UhlamurileView Answer on Stackoverflow