.net Linq-替换(字符串的)列表中的字符串

.net Linq-替换(字符串的)列表中的字符串,.net,vb.net,linq,.net,Vb.net,Linq,我的程序中定义了以下字符串列表: 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 现在,为了学习Li

我的程序中定义了以下字符串列表:

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专家的想法/您认为是实现这一点的最好/最优雅的解决方案。

LINQ是用来读取数据的,您可以根据这些数据采取行动。它不用于更改数据。但是,您可以读取旧集合、处理、获取新集合,然后用它覆盖旧集合,但这不会比通过For循环仅处理原始列表更快。所以你最好的选择可能是:

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

LINQ用于读取数据,您可以对其进行操作。它不用于更改数据。但是,您可以读取旧集合、处理、获取新集合,然后用它覆盖旧集合,但这不会比通过For循环仅处理原始列表更快。所以你最好的选择可能是:

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

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


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

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

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

试试这个

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();
    }
试试这个

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();
    }

对于这样一个只需要一次选择的简单案例,最好/最优雅的解决方案?好吧,为了说明我的观点/问题,我尝试创建一个尽可能简单的示例。。。更大的问题是,我假设ForEach会更快,但根本没有达到预期的效果,我只是想尽可能多地了解这一点……对于这样一个只需要一次选择的简单案例,最好/最优雅的解决方案?嗯,为了说明我的观点/问题,我试图创建一个尽可能简单的例子。。。更大的问题是,我假设ForEach会更快,但根本没有像预期的那样工作,我只是想尽可能多地理解这一点……感谢使用for循环的附加示例。至于LINQforeach方法——它不会工作,因为LINQ只是为了查询而查看数据,而不是在其中具有更新数据的功能?我对你的理解正确吗?原谅我的无知。。。我只是想在这里尽可能多地学习,成为一名更好的程序员。@JohnBustos:是的,进入ForEach方法的数据是不可变的,类似于每个循环的规则for。假设您在lst中为每个s as字符串设置了上述as,您将无法在那里更改s。@约翰布斯托斯:请记住,您的ForEach实际上调用的是a,而不是LINQ。它存在于.NET2.0中。感谢使用for循环的附加示例。至于LINQforeach方法——它不会工作,因为LINQ只是为了查询而查看数据,而不是在其中具有更新数据的功能?我对你的理解正确吗?原谅我的无知。。。我只是想在这里尽可能多地学习,成为一名更好的程序员。@JohnBustos:是的,进入ForEach方法的数据是不可变的,类似于每个循环的规则for。假设您在lst中为每个s as字符串设置了上述as,您将无法在那里更改s。@约翰布斯托斯:请记住,您的ForEach实际上调用的是a,而不是LINQ。它存在于.NET2.0中。谢谢,@Joel,这确实很有道理。。。在这和Neolisk给出一个简单、正常的循环示例之间,它有着完美的意义,只是现在看起来有点傻!!-我想这是件好事:比 ks,@Joel,这真的很有道理。。。在这和Neolisk给出一个简单、正常的循环示例之间,它有着完美的意义,只是现在看起来有点傻!!-我想这是件好事: