【发布时间】:2014-10-21 20:45:12
【问题描述】:
我有一个对象集合,并且想要修改该集合中某个对象的属性。如果我有一个对象,我的 ChangeStuff 方法可以正常工作,并且从该方法返回时对象会被修改。 (Main 中的前 4 行)
但是,在遍历集合时,我想我遗漏了一些东西,因为我更改的值似乎停留在 foreach 循环的范围内。
我不应该传递对象 by ref(或使用 out 参数),因为我没有返回新值。
对于大代码块感到抱歉,但它已尽我所能简化并仍然证明了我的问题。
class foobar
{
public string string1;
public string string2;
}
static void Main(string[] args)
{
/***** THIS WORKS!! *****/
foobar singleFb = new foobar { string1 = "foo2", string2 = "bar2" };
ChangeStuff(singleFb);
Console.WriteLine(singleFb.string1 + ", " + singleFb.string2);
Console.ReadLine(); //pause to read output
/***** THIS DOESN'T WORK!! *****/
List<foobar> myList = new List<foobar> { new foobar {string1 = "foo1", string2 = "bar1"}, new foobar {string1 = "foo2", string2 = "bar2"}, new foobar {string1 = "something else", string2 = "something else again"} };
IEnumerable<foobar> fbs = myList.Where(x => x.string1.StartsWith("foo"));
ChangeStuff(fbs);
foreach (foobar fb in fbs)
{
Console.WriteLine(fb.string1 + ", " + fb.string2);
}
Console.ReadLine(); //pause to read output
}
static void ChangeStuff(IEnumerable<foobar> fbs)
{
foreach (foobar fb in fbs)
{
ChangeStuff(fb);
}
}
static void ChangeStuff(foobar fb)
{
if (fb.string1.Contains("2"))
fb.string1 = "changed!";
}
}
我需要更改哪些内容才能修改集合中的对象?
编辑:另外,刚刚注意到我的收藏实际上完全丢失了“foo2”,当它回来时......很奇怪。我实际上在我的应用程序中使用 IQueryable,并且没有遇到过这个问题。 IE。我拥有所有对象,只是没有正确修改它们。不知道这里发生了什么...
编辑 2: 感谢您的回答,现在非常有意义。如果我按如下方式更改我的
ChangeStuff 方法,它会按我的预期工作:
static void ChangeStuff(foobar fb)
{
if (fb.string2.Contains("2"))
fb.string2 = "changed!";
}
【问题讨论】:
-
“foobar”是一个结构吗?请发布一个简洁但完整的代码示例,以可靠地演示该问题。
-
@PeterDuniho,对不起,我错过了复制课程。见编辑。