首页 > 解决方案 > 使用 lambda 表达式更改列表中的字符串

问题描述

我有一个道路名称列表,并希望它遍历它们并更改它找到“Adams Road 1a”,“Adams Road 2a”的位置......只是“Adams Road”。

下面的代码只会更改列表中的一项。

我想改变所有这些。

communityHouses[communityHouses.FindIndex(
ind => ind.Road.Contains("Adams Road"))].Road= "Adams Road"; 

标签: c#.net

解决方案


您可以使用该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 % 3i % 10000,现在第二个测试表现更好。

我会说使用哪一个真的没关系。只需选择您觉得更干净和易于理解的那个。我会去第二个。


推荐阅读