103

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

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

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

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

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

谢谢,马克斯

4

5 回答 5

201

最简单的方法:

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

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

于 2008-10-23T19:05:41.130 回答
52

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

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
于 2008-10-23T19:00:56.443 回答
4

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

于 2008-10-23T19:05:23.657 回答
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");
}
于 2008-10-23T19:00:17.100 回答
-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"))
于 2013-03-07T08:13:02.490 回答