c# - 使用 lambda 表达式更改列表中的字符串
问题描述
我有一个道路名称列表,并希望它遍历它们并更改它找到“Adams Road 1a”,“Adams Road 2a”的位置......只是“Adams Road”。
下面的代码只会更改列表中的一项。
我想改变所有这些。
communityHouses[communityHouses.FindIndex(
ind => ind.Road.Contains("Adams Road"))].Road= "Adams Road";
解决方案
您可以使用该List<T>.ForEach
方法。
communityHouses.ForEach(ch =>
{
if (ch.Road.Contains("Adams Road")) ch.Road = "Adams Road";
});
更新:
感谢@Flater 的建议。
communityHouses.Where(ch => ch.Road.Contains("Adams Road"))
.ToList().
.ForEach(ch => ch.Road = "Adams Road");
我也做了一些性能测试,第一个总是比第二个好。
这是我的测试:
public class House
{
public string Road { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<House> list1 = new List<House>();
List<House> list2 = new List<House>();
var sample = 50000;
for (int i = 0; i < sample; i++)
{
if (i % 3 == 0)
{
list1.Add(new House() {Road = "Adam Road 1"});
list2.Add(new House() {Road = "Adam Road 1"});
}
else
{
list1.Add(new House(){Road = "Random"});
list2.Add(new House(){Road = "Random"});
}
}
Console.WriteLine("Test " + sample + " samples:");
Stopwatch sw = new Stopwatch();
sw.Start();
list1.ForEach(l =>
{
if (l.Road.Contains("Adam Road")) l.Road = "Adams Road";
});
sw.Stop();
Console.WriteLine("1 - ForEach: " + sw.ElapsedMilliseconds + " ms");
sw.Reset();
sw.Start();
list2.Where(l=> l.Road.Contains("Adam Road")).ToList().ForEach(l =>
l.Road = "Adams Road"
);
sw.Stop();
Console.WriteLine("2 - Where.ToList.ForEach: " + sw.ElapsedMilliseconds + " ms");
}
}
测试结果:
测试 50000 个样本:
1 - ForEach:2 毫秒
2 - Where.ToList.ForEach:3 毫秒
测试 500000 个样本:
1 - ForEach:18 毫秒
2 - Where.ToList.ForEach:21 毫秒
测试 5000000 个样本:
1 - ForEach:179 毫秒
2 - Where.ToList.ForEach:221 毫秒
更新:
我做了另一项测试,我将其更改i % 3
为i % 10000
,现在第二个测试表现更好。
我会说使用哪一个真的没关系。只需选择您觉得更干净和易于理解的那个。我会去第二个。
推荐阅读
- jenkins - 将(相同)参数传递给 Jenkins 管道中的多个构建作业
- windows - 对配置了带有 ARR 的 url-rewrite 的站点的 IIS 错误请求
- neo4j - 如何从 Cypher 中的 randomWalk 调用中获取具有关系的路径?
- android - 我们可以在 BuildConfig 中有非公共常量吗?
- elasticsearch - 如何在无痛弹性搜索中创建字典对象并向其添加数据
- java - org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“bookDaoImpl”的bean时出错
- html - 底部固定 div 被 android 键盘向上推
- c++ - 带有无效指针的 C++ 运算符“&”和“*”
- firebase - Firebase 导出到 BigQuery 事件时间戳时区
- android - Android Studio - 安装失败。安装失败重新运行