C# 如何访问列表的特定索引<;定制类>;();

C# 如何访问列表的特定索引<;定制类>;();,c#,list,indexing,C#,List,Indexing,我有一个名为Tile的自定义类。我有一个平铺对象列表: List<Tile> openList = new List<Tile>(); 然而,当我运行这个程序时,当涉及到Tile current=openList[0]时,我会得到一个错误 错误是: ArgumentOutOfRangeException:参数超出范围。 参数名称:索引 System.Collections.Generic.List`1[Tile].get_项(Int32索引)(at/Users/buil

我有一个名为Tile的自定义类。我有一个平铺对象列表:

List<Tile> openList = new List<Tile>();
然而,当我运行这个程序时,当涉及到
Tile current=openList[0]时,我会得到一个错误

错误是:

ArgumentOutOfRangeException:参数超出范围。 参数名称:索引 System.Collections.Generic.List`1[Tile].get_项(Int32索引)(at/Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:633) AStar.nextLayer()(位于Assets/Scripts/AStar.cs:90)

我一辈子都不知道自己做错了什么。我肯定我忽略了一些愚蠢的事情。如果有人能告诉我我做错了什么,或者如何通过索引访问列表,我将不胜感激


谢谢

我不知道为什么列表突然看起来是空的,但是一个更安全/更干净的方法是获取集合中的第一项:

Tile current = openList.FirstOrDefault();

/* OR : as suggested by David Pfeffer, a faster, less wasteful check */
Tile current = openList.Count == 0 ? null : openList[0]

if(current != null)
{
  //do something with current
}

填充列表的代码是什么。错误参数超出范围,因此列表未填充或为空。您应该了解索引超出范围的原因。

因此,我在执行此操作时出现了相同的错误:

List<int> openList = new List<int>(0);
List openList=新列表(0);
但当我做了下面的事情时,它起了作用

List<int> openList = new List<int>();
openList.Add (0);
List openList=newlist();
openList.Add(0);
所以我猜测,即使列表中的项存在,它也没有被正确构造,所以它是列表中一个没有指向任何东西的项。这被解释为超出范围。
我假设了很多,但它是有效的。

这是您的实际代码吗?如果列表不是空的,它应该可以工作。。。该列表是否也被其他线程使用?@samar因为她想要列表中的第一项,而不是列表中的每一项。如果列表为空,
foreach
循环可以正常工作。您确定看到记录的消息吗?t.getGScore()可能不会以您不希望的方式操纵列表?(正在删除项,将其设置为null…@AlexandreMachado如果在
foreach
循环中修改了列表,则会引发异常。我不同意这一点,因为
FirstOrDefault
必须将列表视为可枚举对象,创建一个枚举器对象并在列表中逐个向前移动。数组或列表的吸引力之一是直接索引。那么为什么要使用
列表呢?使用
。Any()
会做同样的事情,但不会返回对象。
openList.Count==0?null:openList[0]
@DavidPfeffer这不是真的
FirstOrDefault
实现检查基础类型是否为
IList
,如果是,将首先验证
.Count
属性。使用
FirstOrDefault
比使用三元运算符的版本更具可读性。是的,它回答他的索引超出范围,他应该调查索引超出范围的原因。
List<int> openList = new List<int>();
openList.Add (0);