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

时间:2015-04-28 06:18:29

标签: c# foreach

我很确定以前在我编写的一些代码中已经有用了,不知道我在这里缺少什么。

以下代码不会更改列表中的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

3 个答案:

答案 0 :(得分:6)

string是不可变的,因此无法更改。为该变量分配另一个值只会改变该变量(按引用调用和按值调用之间的差异)。

使用ForEach - 方法时,实际上使用lambda-expression中声明的items - 变量迭代item - 列表。为该变量分配不同的值不能更改列表。

并明确我的第一句话意味着什么:你不能改变你的变量的值,因为它是不可变的,所以你分配变量,这不会对列表产生影响。

答案 1 :(得分:6)

如果您想获得不同的结果,则应使用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是指向heap上存在的new object()的指针。

当您通过调用obj1public void Foo(object obj) { //... }传递给函数Foo(obj1)时,该函数会将参数作为 new 指针指向相同< / strong> object在堆上。

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

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

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

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

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

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

答案 2 :(得分:4)

Foreach根本无法做到,因为item是循环范围内的局部变量 你拥有的与使用长版本基本相同:

foreach(string item in listBox1.Items.Cast<string>().ToList())
{
    item = (!chkBox1.Checked) ? "move " + item : "move -check " + item;
}

您可以使用for循环来实现目标:

string Item;
for(var i=0;i < listBox1.Items.Count; i++)
{
    Item = listBox1.Items[i].ToString(); // Listbox Items are objects, so you need to use ToString() here
    listBox1.Items[i] = (chkBox1.Checked) ? "move -check " + Item : "move " + Item;
}

当然,假设这些项目应该是字符串。我也提高了你的三元条件的可读性。