gpt4 book ai didi

c# - ForEach 不会更改/更改列表 C# 中的项目

转载 作者:太空狗 更新时间:2023-10-29 20:52:46 25 4
gpt4 key购买 nike

我很确定这在我之前编写的一些代码中有效,但不确定我在这里遗漏了什么。

以下代码不会更改列表中的 string 值。为什么?

var items = listBox1.Items.Cast<string>().ToList();
items.ForEach(item => item = (!chkBox1.Checked) ? "move " + item : "move -check " + item);

编辑:澄清一下,列表与创建时的列表保持一致。

编辑:抱歉,项目列表 (listBox1.Items) 包含如下字母数字字符串。

J00123456

J00123344

J00123458

另外,为了确认,我已经使用 T 的自定义列表(如下所示)成功完成了此操作,这就是我认为它可以在这里工作的原因。

var tapes = new List<TapeInfo>();
... //Populated list
tapes.ForEach(x => x.vItem = "tapelib 3592 -eject " + x.vItem); //Works here

最佳答案

如果你想得到不同的结果,你应该使用Select函数。

var items = listBox1.Items.Cast<string>().ToList();
listBox1.Items = items.Select(item => (!chkBox1.Checked) ? "move " + item : "move -check " + item).ToList();

ForEach 函数可以根据集合值执行某些操作,但不能对值本身执行操作。

Select 函数将根据给定的集合创建一个新集合。

编辑

关于您使用成功更改值的编辑

tapes.ForEach(x => x.vItem = "tapelib 3592 -eject " + x.vItem);

您需要了解按值/引用传递参数的工作原理。

在c#中,写var obj1 = new object()时,obj1是指向存在于new object()的指针heap .

当您通过调用 Foo(obj1)obj1 传递给函数 public void Foo(object obj) {//... } 时>,该函数将获取参数作为指向堆上相同对象指针。

因此,当您对对象本身使用 ForeEach 时,

object.ForEach(obj => obj = new object()) // No changed outside the Foreach

只有新指针会改变,它会指向一个新对象,但原始指针不会改变。

但是如果你在一个内部对象上使用它,

object.ForEach(obj => obj.InnerObject = new object()) // Changed outside the Foreach

这将更改指向的内部对象,并且内部对象将被更改。

关于c# - ForEach 不会更改/更改列表 C# 中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29911734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com