我昨天在StackOverflow上的一个回复中看到了一个代码片段,这引起了我的兴趣。它是这样的:
List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"};
myList.ForEach(d=>d.ToLower());
我希望我能用它将myList中的所有项目转换为小写。但是,它不会发生......运行之后,myList中的大小不变。
所以我的问题是,是否有一种方法,使用LINQ和Lambda表达式轻松迭代并以类似的方式修改列表的内容。
谢谢, 最大
答案 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
。由于x
是string
,因此它是不可变的,所以你在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"))