1

List(Of String)在我的程序中定义了以下内容:

MyList:
1Test
2test
3
4Test
5

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

我知道我可以使用以下 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 专家的意见,你的想法是什么/你会建议什么是实现这一目标的最佳/最优雅的解决方案。

4

3 回答 3

3

LINQ 用于读取数据,您可以对其采取行动。它不用于更改数据。但是,您可以读取旧集、处理、获取新集,然后用它覆盖旧集,但这不会比通过 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
于 2013-05-22T20:52:47.213 回答
1

它不会更新列表,因为您没有更新列表。您的函数正在获取一个名为MyEntry传递给它的变量,并且您正在覆盖该变量,但没有将新值放回列表中。这也是一件好事,因为如果您确实将修改后的值放回列表中,您可能会得到一个关于在枚举期间修改集合的异常。

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

于 2013-05-22T21:01:53.567 回答
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
于 2013-05-23T03:26:02.087 回答