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

114

昨天我在StackOverflow上看到了一段代码片段,引起了我的兴趣。它是这样的:

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

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

我希望可以使用它将myList中的所有项转换为小写。但是,运行后,myList中的字符大小写没有改变。

所以我的问题是,是否有一种使用LINQ和Lambda表达式轻松迭代并修改列表内容的方法。

谢谢, Max

5个回答

220

最简单的方法:

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

和您的示例代码差异不大。ForEach循环原始列表,而ConvertAll创建一个新的列表,您需要重新分配它。


@leppie:没错,这不是 - 发现得好。在这种情况下,担心它是实例方法还是扩展方法可能有点迂腐,但绝对是准确的。 :) - Jason Bunting
2
字符串是不可变的 :P - DarkMakukudo

55

那是因为ToLower方法返回一个小写字符串,而不是转换原始字符串。所以你需要像这样做:

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

1
我喜欢这种方法胜过被接受的答案,因为你可以使用它与任何IEnumerable<string>,而不仅仅是List<string>。 - KatDevsGames
8
这个解决方案同样适用于.NET Core,但是在.NET Core中不存在ConvertAll。 - Jonas

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

4

ForEach使用的是Action<T>,这意味着如果x不是不可变的,你可以对它进行更改。由于x是一个string,它是不可变的,所以在lambda中对它做任何操作都不会改变它的属性。除非你想要实现自己的扩展方法来返回替换值,否则Kyralessa的解决方案是最佳选择。


如果您不确定,请进行更多的研究...还记得什么吗? - Patrick Desjardins
错误是人性的,我提供的链接中有3.5加粗和2.0正常显示,我没有看到。我已经删除了我的帖子...你只需要简单地评论一下就可以了。你想无缘无故地踩我,那现在就承担吧。 - Patrick Desjardins
尽管我写这篇文章已经过去了将近一年,而且我并不是Daok,但我会告诉你为什么你的回答是“错误”的。你说"Kyralessa的解决方案是你最好的选择",但事实并非如此——我的解决方案更清晰、更简洁。 - Jason Bunting

-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"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接