RemoveAt()不工作c#
即使在使用RemoveAt()不工作c#,c#,list,removeclass,removeall,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(distri
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());
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);
var-candidates=queryCandidates.ToList();
var elementsToRemove=新列表();
foreach(候选行中的var行)
{
// ...
xString=候选人[i]。地区;
// ...
如果(临时==假)
{
// ...
elementsToRemove.Add(i);
}
}
for(int i=elementsToRemove.Count-1;i>=0;--i)
RemoveAt(elementsToRemove[i]);
返回视图(候选人);
请注意elementsToRemove
的用法。不能直接删除循环中的项。这将抛出一个异常
此外,请注意,
ToList
复制所有数据。每次你叫它。显然,在循环中执行此操作不是一个好主意。queryCandidates
不是一个列表
您正在将其转换为一个列表,该列表创建一个新实例,从中删除该项,但不影响queryCandidates
本身
你可以做:
var queryCandidates myCollection.ToList()代码>
然后
queryCandidates.RemoveAt(i)代码>
ToList()创建一个全新的列表,然后从中删除一个元素,但该列表早已消失
尝试:
请注意,我将您的foreach更改为for(相反),因为在使用foreach对列表进行迭代时无法修改列表 我不太确定queryCandidates是什么类型,但是您没有看到更新的原因是您从错误的对象中删除了元素“I”。函数的作用是:创建列表类型的新对象。如果要保留更改,需要缓存该列表,并在使用原始queryCandidates对象的位置使用它。每次调用该列表时,ToList()函数都会创建一个新列表。对象将从该列表中删除,而不是从原始列表中删除。所以你应该在出发前给托利斯打个电话
完成此操作后,removeAt()调用将起作用并导致新问题,因为此时您正试图从foreach循环中修改列表。因此,您需要以一种将删除也从循环中移除的方式重写代码。对我来说有效的方法是从下往上移除:
for (int i = list.Count - 1; i > 0; i--)
{
if (list[i][0] == " " || list[i][3] == "0")
list.RemoveAt(i);
}
减少项目计数后,某些项目丢失是有意义的。这是一个很大的ToList()
。每次创建新列表(queryCandidates.ToList().RemoveAt(i);
),从列表中删除一个项目并扔掉该列表空的catch{}
只会隐藏错误。最好删除它。另一个问题是他/她试图修改foreach循环中的集合。这行不通。@downvoter:请留下评论,这样我可以改进答案。好的,谢谢你的快速回答,也谢谢你让我注意到为什么没有保存结果没有问题,但是请注意,如果你试图修改你正在迭代的列表,C会非常生气。因此,您可能必须将foreach循环更改为while循环(检查i是否var newList = queryCandidates.ToList();
for (int i=newList.Count-1; i>=0; i--){
///snip
newList.RemoveAt(i);
for (int i = list.Count - 1; i > 0; i--)
{
if (list[i][0] == " " || list[i][3] == "0")
list.RemoveAt(i);
}