即使在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());
答案 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] == " " || list[i][3] == "0")
list.RemoveAt(i);
}
减少项目数后,有些项目会被遗漏。