我昨天在StackOverflow上的一个响应中看到了一段代码片段,引起了我的兴趣
List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"};
myList.ForEach(d=>d.ToLower());
我希望我可以用它将myList中的所有项目转换为小写。然而,这并没有发生。。。运行此操作后,myList中的大小写保持不变。
因此,我的问题是,是否有一种方法,使用LINQ和Lambda表达式以类似的方式轻松地迭代和修改列表的内容。
谢谢,最大
最简单的方法:
myList = myList.ConvertAll(d => d.ToLower());
与示例代码没有太大区别。ForEach
循环原始列表,而ConvertAll
创建一个需要重新分配的新列表。
这是因为ToLower返回一个小写字符串,而不是转换原始字符串。所以你想要这样的东西:
List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
[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");
}
ForEach
使用Action<T>
,这意味着如果x
不是不可变的,则可能会影响它。由于x
是string
,所以它是不可变的,所以在lambda中对它所做的任何操作都不会改变它的属性。Kyralessa的解决方案是您的最佳选择,除非您想实现自己的扩展方法,允许您返回替换值。
var _reps = new List(); // with variant data
_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))