RemoveAt不会从指定的索引中删除

时间:2018-05-12 17:07:32

标签: c#

我的练习是在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;
}

2 个答案:

答案 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.

我确信这方面有很多方法,但这里的主要问题是你不明白发生了什么。