我的程序中定义了以下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专家的意见,你的想法是什么/你会建议什么是最好的/最优雅的解决方案来实现这一目标。
答案 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