Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RemoveAt()不工作c#_C#_List_Removeclass_Removeall - Fatal编程技术网

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] == "&nbsp;" || 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] == "&nbsp;" || list[i][3] == "0")
        list.RemoveAt(i);
}