List泛型Add后,所有值都是最后一次Add的结果。请高物帮忙,解决立即结帐

johnshao 2007-05-10 03:33:13
//程序如下

public struct MyStructTest
{
public int Flag;
public Point pt;
public List<string> aryMark
};
List<MyStructTest> aryTest = new List<MyStructTest>();

MyStructTest test1;
test1.aryMark = new List<string>();
test1.aryMark.Add("");

for(int i = 0; i < 10; i +++
{
test1.Flag = i;
test1.pt = new Point(i,i);
test1.aryMark[0] = i.ToString();

aryTest.Add( test1 );

}

//错误结果
//最后得到的aryTest中,所有元素的aryMark[0]值都是9。本来我希望的是从0-9
//哪位高人给解决一下

...全文
779 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiyun 2007-05-10
  • 打赏
  • 举报
回复
反正要New,放哪new 都行,只要在使用前...
johnshao 2007-05-10
  • 打赏
  • 举报
回复
终于结贴成功,谢谢
超级帅虫虫No1 2007-05-10
  • 打赏
  • 举报
回复
for(int i = 0; i < 10; i +++
{
test1.Flag = i;
test1.pt = new Point(i,i);
test1.aryMark[0] = i.ToString();


}
aryTest.Add( test1 );
放外边啊,
johnshao 2007-05-10
  • 打赏
  • 举报
回复
刚才给分老不成功, ̄ ̄
johnshao 2007-05-10
  • 打赏
  • 举报
回复
感觉别扭,没有C++好用啊
superbug1984 2007-05-10
  • 打赏
  • 举报
回复
不是9才奇怪了
sophia2000 2007-05-10
  • 打赏
  • 举报
回复
MyStructTest test1;
test1.aryMark = new List<string>();
test1.aryMark.Add("");
三句放到循环里面去。
sophia2000 2007-05-10
  • 打赏
  • 举报
回复
默认是传引调用
johnshao 2007-05-10
  • 打赏
  • 举报
回复
不同意见欢迎继续跟

结帐
johnshao 2007-05-10
  • 打赏
  • 举报
回复
解决方法只能在循环内new?有没有其它解决办法?
xiyun 2007-05-10
  • 打赏
  • 举报
回复
test1.aryMark[0] ... 都指向同一个对象,当然出错
Avoid 2007-05-10
  • 打赏
  • 举报
回复
因为C#默认是传引调用
johnshao 2007-05-10
  • 打赏
  • 举报
回复
呵呵,感谢,刚出去了一趟。

在循环里new是可以的,难到非得每次都new一个,这也太麻烦了?

准备结帐了
guoweijun394 2007-05-10
  • 打赏
  • 举报
回复
test1 10次循环就一个对象,是引用类型
Macosx(结贴) 是正确的
XMUMEEameng 2007-05-10
  • 打赏
  • 举报
回复
MyStructTest虽然是结构体,但是里面的aryMark是分配在堆上的,MyStructTest只保有一个它的引用,aryTest每次add的时候,拷贝一个test1,但里面的aryMark其实都是指向同一个aryMark,循环到最后里面的值是几,aryTest中所有的就都是几。
更改:把
MyStructTest test1;
test1.aryMark = new List<string>();
test1.aryMark.Add("");
三句放到循环里面去。
Macosx 2007-05-10
  • 打赏
  • 举报
回复
把一个对象添加了10次 当然得到10个相同的对象 就改为
static void Main(string[] args)
{
List<MyStructTest> aryTest = new List<MyStructTest>();

for (int i = 0; i < 10; i++)
{
MyStructTest test1;
test1.aryMark = new List<string>();
test1.aryMark.Add("");
test1.Flag = i;
test1.pt = new Point(i, i);
test1.aryMark[0] = i.ToString();

aryTest.Add(test1);
}
foreach (MyStructTest test in aryTest)
{
Console.WriteLine(test.aryMark[0]);
}
}
xlshen_lxz 2007-05-10
  • 打赏
  • 举报
回复
楼主的意思是否是想这样:

public struct MyStructTest
{
public int Flag;
public Point pt;
public List<string> aryMark
};
List<MyStructTest> aryTest = new List<MyStructTest>();

MyStructTest test1;
test1.aryMark = new List<string>();
test1.aryMark.Add("");

for(int i = 0; i < 10; i +++
{
test1.Flag = i;
test1.pt = new Point(i,i);
test1.aryMark[i] = i.ToString();
}

aryTest.Add( test1 );
xlshen_lxz 2007-05-10
  • 打赏
  • 举报
回复
test1.aryMark[0] = i.ToString();
这里你每次都是将i放到数组[0]里啊,你的意思应该是写test1.aryMark[i]吧
dinoLgrace 2007-05-10
  • 打赏
  • 举报
回复
你有把数据从0存到9,但是最后是9把以前的覆盖了,设断点调试下
antoniusguo 2007-05-10
  • 打赏
  • 举报
回复
MyStructTest makeMyStruct()
{
MyStructTest test1;
test1.aryMark = new List<string>();
test1.aryMark.Add("");
}

for(int i = 0; i < 10; i++)
{
MyStructTest test1 = makeMyStruct();
test1.Flag = i;
test1.pt = new Point(i,i);
test1.aryMark[0] = i.ToString();

aryTest.Add( test1 );

}
加载更多回复(1)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧