2

即使使用该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());
4

6 回答 6

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复制所有数据。每次你调用它。很明显,在循环中这样做不是一个好主意。

于 2012-10-17T15:45:29.277 回答
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 迭代列表时无法修改列表。

于 2012-10-17T15:47:23.407 回答
3

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

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

于 2012-10-17T15:49:43.603 回答
1

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

于 2012-10-17T15:47:31.100 回答
0

queryCandidates不是列表。

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

你可以做:

var queryCandidates myCollection.ToList();

接着

queryCandidates.RemoveAt(i);

于 2012-10-17T15:46:15.033 回答
0

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

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

在减少项目数后遗漏一些项目是有道理的。

于 2014-04-14T20:31:55.680 回答