我有一个列表,希望在删除一个又一个元素的同时顺利遍历它。我以为我可以这样做:
List<Point> open = new List<Point>();
...
while (!(open == null))
{
Point p = open.RemoveAt(0);
...
然而,从#34开始,我的工作方式并不是很完美;不能隐式转换类型&#39; void&#39;到了&#39;点&#39;&#34;。但是,在删除它/使其无效之前,不应该使用RemoveAt的调用来指向P吗?
答案 0 :(得分:5)
List.RemoveAt
不会返回您要删除的项目。当您删除所有项目时,列表也不会变为null
。它将变为空,即Count等于0
。我建议您使用Queue<T>
代替List<T>
。因此,您将能够删除拳头添加的项目并同时获取它:
Queue<Point> open = new Queue<Point>();
while(open.Count > 0)
{
var point = open.Dequeue();
// ...
}
如果你想使用list,并删除第一项,那么你应该按索引检索项目,然后才从列表中删除它:
List<Point> open = new List<Point>();
while (open.Count > 0) // or open.Any()
{
Point p = open[0];
open.RemoveAt(0);
// ...
}
答案 1 :(得分:4)
不,它没有。它不会返回任何内容,as per the specification。请尝试使用Queue<Point>
。另外,删除List<T>
中的第一项确实强制了数组内容的副本据我所知(如果有人知道,请添加相关参考),所以总是避免删除列表中的第一个元素并尝试总能找到最佳的数据结构来解决您的特定问题!
示例:
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
}