Linq - 替换List(String)中的字符串

时间:2013-05-22 20:23:24

标签: .net vb.net linq

我的程序中定义了以下List(Of String)

MyList:
1Test
2test
3
4Test
5

我想从列表中的每个项目中删除单词“Test”(无论大小写),如果它存在的话。

我知道我可以使用以下LINQ语句来完成此任务:

MyList = (From MyEntry As String In MyList
          Select UCase(MyEntry).Replace("TEST", "")).ToList

获得最终结果:

MyList:
1
2
3
4
5

现在,只是为了学习Linq,我想尝试使用不同的命令(甚至可能甚至对它们进行基准测试,看看哪个可能是最好的/最有效的)。所以我想尝试一下:

MyList.ForEach(Function(MyEntry As String) MyEntry = UCase(MyEntry).Replace("TEST", ""))

但它似乎没有更新列表。

我假设这是因为ForEach不会替换正在迭代的数据,但我想听听任何LINQ专家的意见,你的想法是什么/你会建议什么是最好的/最优雅的解决方案来实现这一目标。

3 个答案:

答案 0 :(得分:3)

LINQ用于读取您可以采取行动的数据。它不用于更改数据。但是,你可以读取旧的set,进程,获取新的set,然后用它覆盖旧的set,但它不会比通过For循环对原始List工作更快。所以你最好的选择可能就是:

Dim lst As New List(Of String)({"1Test", "2test", "3", "4Test", "5"})
For i = 0 To lst.Count - 1
  lst(i) = Regex.Replace(lst(i), "test", "", RegexOptions.IgnoreCase)
Next

答案 1 :(得分:1)

它不会更新列表,因为您没有更新列表。您的函数正在获取一个名为MyEntry的变量,并且您正在覆盖该变量,但无法将新值重新放入列表中。这也是一件好事,因为如果你把修改后的值放回到列表中,你可能会在枚举期间得到一个关于被修改的集合的例外。

我会坚持使用修改后的版本替换整个列表的原始版本,或者执行正常的for循环而不是foreach循环。

答案 2 :(得分:0)

试试这个

static void Main(string[] args)
    {
        List<string> lst = new List<string>() { "1Test", "2Test","33", "3test" };
        var q = from T in lst
                select new
                {
                    NewT = T.ToUpper().Replace("TEST", "")
                };
        Console.WriteLine("");

        int i = 0;
        foreach (var str in q.ToList())
        {
            lst[i++] = str.NewT;
            Console.WriteLine(str.NewT);

        }
        Console.Read();
    }

这是结果

1
2
33
3