C# C列表移除(0)

C# C列表移除(0),c#,list,loops,null,C#,List,Loops,Null,我有一个列表,希望在删除一个又一个元素的同时平滑地遍历它。我想我可以这样做: List<Point> open = new List<Point>(); ... while (!(open == null)) { Point p = open.RemoveAt(0); ... 然而,它并没有像我希望的那样工作,从不能隐式地将类型“void”转换为“Point”开始。但是在删除P/使其

我有一个列表,希望在删除一个又一个元素的同时平滑地遍历它。我想我可以这样做:

    List<Point> open = new List<Point>();
...            
while (!(open == null))
            {
                Point p = open.RemoveAt(0);
...
然而,它并没有像我希望的那样工作,从不能隐式地将类型“void”转换为“Point”开始。但是在删除P/使其无效之前,RemoveA的调用不应该给P打分吗?

不会返回您正在删除的项目。当您删除所有项目时,列表也不会变为空。它将变为空,即计数等于0。我建议你用这个代替。因此,您将能够移除第一个添加的项目,并同时获得它:

Queue<Point> open = new Queue<Point>();

while(open.Count > 0)
{
    var point = open.Dequeue();
    // ...
}
若要使用列表并删除第一个项目,则应按索引检索项目,然后才将其从列表中删除:

List<Point> open = new List<Point>();

while (open.Count > 0) // or open.Any()
{
    Point p = open[0];
    open.RemoveAt(0);
    // ...
}

不,没有。它不返回任何内容。尝试改用队列。此外,删除列表中的第一项确实会强制创建数组内容的副本。据我所知,如果有人知道,请添加相关引用,因此始终避免删除列表中的第一个元素,并尝试始终找到最佳数据结构来解决您的特定问题

例如:

var open = new Queue<Point>();
// ... Fill it
// Any() is in general faster than Count() for checking that collection has data
// It is a good practice to use it in general, although Count (the property) is as fast
// but not all enumerables has that one
while (open.Any())     {
   Point p = open.Dequeue();
   // ... Do stuff
}

顺便说一句,删除第0项对于RemoveAt来说是最糟糕的情况。只需为此编写一个简单的方法,或者只需使用更合适的集合类型。@harold true,这将需要复制整个内部阵列。使用集合时,Any的速度不会快于访问Count属性。但我觉得它更具可读性think@SergeyBerezovskiy事实上,我在考虑计数方法,我会澄清我可能造成的混乱。