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

时间:2008-10-23 18:54:03

标签: c# linq lambda foreach

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

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

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

我希望我能用它将myList中的所有项目转换为小写。但是,它不会发生......运行之后,myList中的大小不变。

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

谢谢, 最大

5 个答案:

答案 0 :(得分:154)

最简单的方法:

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

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

答案 1 :(得分:40)

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

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

答案 2 :(得分: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 :(得分:3)

ForEach使用Action<T>,这意味着如果它不是不可变的,您可以影响x。由于xstring,因此它是不可变的,所以你在lambda中对它做的任何事都不会改变它的属性。 Kyralessa的解决方案是您的最佳选择,除非您想要实现自己的扩展方法,允许您返回替换值。

答案 4 :(得分:-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"))