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



我昨天在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不是不可变的,则可能会影响它。由于xstring,所以它是不可变的,所以在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"))

相关内容

  • 没有找到相关文章

最新更新