如何使用LINQ将List <string>中的所有string转换为小写?

我昨天在StackOverflow的一个响应中看到了一个代码片断,这让我很感兴趣。 这是这样的:

List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"}; myList.ForEach(d=>d.ToLower()); 

我希望我可以用它来将myList中的所有项目转换为小写。 然而,这不会发生…运行后,myList中的套pipe是不变的。

所以我的问题是,是否有一种方法,使用LINQ和Lambdaexpression式轻松地遍历和修改列表的内容以类似于此的方式。

谢谢,马克斯

最简单的方法:

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

与示例代码没有太大的不同。 ForEach循环的原始列表,而ConvertAll创build一个新的,你需要重新分配。

这是因为ToLower 返回一个小写string而不是转换原始string。 所以你想要这样的东西:

 List<string> lowerCase = myList.Select(x => x.ToLower()).ToList(); 
 [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"); } 

ForEach使用Action<T> ,这意味着如果它不是不可变的,就可以影响x 。 由于x是一个string ,它是不可变的,所以在lambda中没有做任何事情将改变它的属性。 Kyralessa的解决scheme是您的最佳select,除非您想实现您自己的扩展方法,允许您返回重置值。

 var _reps = new List(); // with variant data _reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))