我很确定以前在我编写的一些代码中已经有用了,不知道我在这里缺少什么。
以下代码不会更改列表中的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
答案 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()
的指针。
当您通过调用obj1
将public 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;
}
当然,假设这些项目应该是字符串。我也提高了你的三元条件的可读性。