我的练习是在List<T>
中加上相等的数字。当我调用RemoveAt(int index)
时,它不会在指定的索引处删除,它会删除列表的最后一个索引。
private static int GetNumberFromInput(List<int> input)
{
int sum = 0;
for (int i = 0; i < input.Count; i++)
{
if (i == input.Count - 1)
{
break;
}
if (input[i] == input[i + 1])
{
sum = input[i] + input[i + 1];
input.RemoveAt(i);
input[i] = sum;
i--;
}
if (input[i] != input[i + 1])
{
if(input[i+1] == input[i + 2])
{
sum = input[i + 1] + input[i + 2];
input.RemoveAt(input[i + 1]);
input[i + 1] = sum;
}
i--;
}
}
return sum;
}
答案 0 :(得分:1)
首先,input.RemoveAt(input[i + 1]);
应该只是input.RemoveAt(i + 1);
。
但即使这样也会给你带来麻烦。
假设您有一个包含5个项目(索引0到4)的列表,其值为“A”,“B”,“C”,“D”和“E”。
您致电myList.RemoveAt(3)
。这将删除索引3处的项目,即D
。该列表现在具有元素“A”,“B”,“C”和“E”。但是,它 NOT 有索引0,1,2和4.它有索引0,1,2和3.最后一项(E
)现在在索引3而不是索引4。
如果你还需要删除索引值3,以便保留0,1,2和4,你真正想要的是带有整数键的Dictionary。
这段代码特别可怕,因为它发生在循环中。循环体中input[i]
的后续引用现在指的是下一个项目。特别是,在迭代(循环)它时修改任何类型的集合是不好的做法。如果你必须这样做,那么更好的选择是从后面/后面开始,然后朝前面/后面开始。
答案 1 :(得分:0)
首先,如果所有元素都不同,循环永远不会结束。
无论如何,所以说我们有一个List<int> list
,里面有3个项目。
int i = 0; // will be owr index
list[0] = 4;
list[1] = 4;
list[2] = 3;
现在说出input.RemoveAt(i);
i = 0
。
列表如下:
list[0] = 4;
list[1] = 3;
然后你去说input[i] = sum;
i=0 , sum=8
列表如下:
list[0] = 8;
list[1] = 3;
一种解决方法是
input[i] = sum; // repalce the item
input.RemoveAt(i+1); // then remove the next one, since they're identical.
我确信这方面有很多方法,但这里的主要问题是你不明白发生了什么。