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


94

我昨天在StackOverflow上的其中一个响应中看到了一个代码片段,这引起了我的兴趣。就像这样:

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

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

我希望可以使用它将myList中的所有项目转换为小写。但是,这不会发生...运行此命令后,myList中的大小写不变。

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

谢谢,马克斯

Answers:


181

最简单的方法:

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

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


4
不是扩展方法。
leppie 2011年

@leppie:是的,不是-很好。在这种情况下,担心它是实例方法还是扩展方法可能有点花哨,但绝对可以。:)
Jason Bunting

和字符串是不可变的:P
Sherlock

48

这是因为ToLower 返回的是小写字符串,而不是转换原始字符串。因此,您需要这样的东西:

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

1
我比接受的答案更喜欢这种方法,因为您可以将其与任何IEnumerable <string>一起使用,而不仅限于List <string>。
2015年

6
此解决方案也可以在.NET Core中使用,而ConvertAll在.NET Core中不存在。
乔纳斯(Jonas)

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它是否不可改变。由于xstring,它是不可变的,因此您在lambda中对其执行的任何操作均不会更改其属性。除非您要实现自己的扩展方法以允许您返回替换值,否则Kyralessa的解决方案是您的最佳选择。


如果您不确定...请记住一些事情?
Patrick Desjardins,

错误是人为的,我提供的链接以粗体显示3.5,正常显示2.0,我没有看到它。我已经删除了我的帖子...您的简单评论就足够了。您现在就想无缘无故地投票。
Patrick Desjardins,

尽管我将近一年后才写这篇文章,尽管我不是Daok,但我会告诉您为什么答案是“错误的”-如果不是,您会说“ 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"))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.