RemoveAt()不工作c#

时间:2012-10-17 15:44:04

标签: c# list removeclass removeall

即使在RemoveAt()方法之后,我的列表也保持不变,我甚至没有收到错误:

foreach (var row in queryCandidates.ToList())
{
    try
    {
        xString = queryCandidates.ToList().ElementAt(i).District;
        int.TryParse(xString, out xNumber);

        temp = xNumber.Equals(districtNumber);
        System.Diagnostics.Debug.Write(temp+ " ");
        System.Diagnostics.Debug.Write(i+" ");
        if (temp == false)
        {
            System.Diagnostics.Debug.WriteLine(" i is:"+i);

            //not working even when it should
            queryCandidates.ToList().RemoveAt(i);

        }
    }

    catch { }
    i++;
    if (last == i)
    {
        System.Diagnostics.Debug.WriteLine("before ending loop: ");
        return View(queryCandidates.ToList());
    }
}

System.Diagnostics.Debug.WriteLine("after ending the loop: ");
return View(queryCandidates.ToList());

6 个答案:

答案 0 :(得分:7)

ToList()创建一个新实例。从这个实例中删除元素。您从原始枚举中删除该元素。

你应该做这样的事情:

var candidates = queryCandidates.ToList();
var elementsToRemove = new List<int>();
foreach (var row in candidates)
{
    // ...
    xString = candidates[i].District;
    // ...
    if (temp == false)
    {             
        // ... 
        elementsToRemove.Add(i);
    }  
}

for(int i = elementsToRemove.Count - 1; i >= 0; --i)
    candidates.RemoveAt(elementsToRemove[i]);

return View(candidates);

请注意使用elementsToRemove。您无法直接在循环中删除项目。这会引发异常。


此外,请注意ToList复制所有数据。每次你打电话给它。很明显,这不是一个好循环的做法。

答案 1 :(得分:4)

queryCandidates.ToList().RemoveAt(i);

ToList()创建一个全新的列表,然后从中删除一个元素,但该列表早已消失。

尝试:

var newList = queryCandidates.ToList();

for (int i=newList.Count-1; i>=0; i--){
 ///snip
 newList.RemoveAt(i);

请注意,我将foreach更改为for(反向),因为在使用foreach迭代列表时无法修改列表。

答案 2 :(得分:3)

每次调用时,ToList()函数都会创建一个新的List。该对象将从该列表中删除,而不是从原始列表中删除。所以你应该在foreach之前调用ToList一次。

完成后,removeAt()调用将起作用并导致新问题,因为那时您正试图从foreach循环中修改列表。因此,您需要以一种将删除循环移出循环的方式重写代码。

答案 3 :(得分:1)

嗯,我不确定Type queryCandidates是什么,但是你没有看到更新的原因是因为你要从错误的对象中删除元素'i'。您的ToList()函数创建List类型的新对象。如果要保留更改,则需要缓存该列表,并在使用原始queryCandidates对象的地方使用它。

答案 4 :(得分:0)

queryCandidates不是列表。

您正在将其转换为一个列表,该列表会创建一个新实例,您可以从中删除该项目,但不会影响queryCandidates本身。

你可以这样做:

var queryCandidates myCollection.ToList();

然后

queryCandidates.RemoveAt(i);

答案 5 :(得分:0)

对我有用的是从下往上删除:

for (int i = list.Count - 1; i > 0; i--)
{
    if (list[i][0] == "&nbsp;" || list[i][3] == "0")
        list.RemoveAt(i);
}

减少项目数后,有些项目会被遗漏。