我在C#中使用ArrayList来做一些事情。 我有2个ArrayLists(对齐和最佳),并且在特定时间内,我在“for”例程中做出最佳=对齐。
问题是,在循环结束时,我做了align.Clear,但是在这个时候,数组“best”也被清除了。在循环之后,当我必须使用数组“最好”时,我会遇到麻烦,因为它被清除了,我试图访问它的索引。
有什么问题?
这是我的一段代码:
public string AntColony()
{
ArrayList align = new ArrayList();
ArrayList best = new ArrayList();
for(int z=0;z<n_ants;z++)
{
//do the things i have to do
//full the array "align" with something (this will have two "adds", so, this array is a 2 lines array)
score = Score(align);
UpdatePhero(tao, path, score);
if (score > score_before)
{
score_before = score;
best = align;
}
align.Clear(); //clear the array align
}
string s = best[0].ToString() + "\r\n\r\n" + best[1].ToString() + "\r\n\r\n Number of matches: " + n_matches + "\r\n\r\n Score: " + score;
return s;
}
谢谢!
答案 0 :(得分:2)
数组变量是引用类型。当您致电best=align
时,您并非将align
的内容复制至array
,您正在制作它以便他们指向同一个地方,即他们参考相同的记忆位置。
尝试best=align.Clone()
答案 1 :(得分:0)
由于align是临时的,因此可以在调用Score
之前重新创建,并在需要时分配为最佳:
public string AntColony()
{
ArrayList best = null;
for(int z=0;z<n_ants;z++)
{
//do the things i have to do
//full the array "align" with something (this will have two "adds", so, this array is a 2 lines array)
ArrayList align = new ArrayList();
score = Score(align);
UpdatePhero(tao, path, score);
if (score > score_before)
{
score_before = score;
best = align;
}
}
if (best != null)
{
string s = best[0].ToString() + "\r\n\r\n" + best[1].ToString() + "\r\n\r\n Number of matches: " + n_matches + "\r\n\r\n Score: " + score;
return s;
}
// TODO: Report failure here
return null;
}