在列表上运行Linq查询时,将引发此错误。
我在C#中使用Unity3D 3.0(Unity3D使用Mono 2.6)。据我所知,Unity3D是单线程的。它通过将继承基类的“脚本”(C#.cs文件)附加到“GameObject”来工作。另外,Unity控制脚本的实例化和序列化,因此您不能使用构造函数。
我有一个RoadNetwork脚本,其中包含对RoadNodes和RoadCurves的引用,它们均通过单例定位RoadNetwork并自行注册/注销。我已经在RoadNode和RoadCurve中放置了“微型工厂”,这些微型工厂进行了将自身与游戏对象 Hook 的艰巨工作。
RoadNode首先通过执行以下操作与RoadNetwork进行检查,以确保在同一位置没有节点:
public static RoadNode2 New(float x, float y, float z)
{
//First try to find an existing one
var rn = RoadNetwork.Instance.GetNodeAtPosition(new Vector3(x, y, z))
?? UnityReferenceHelper.GetNewGameObjectFor<RoadNode2>(
"RoadNode_" + (RoadNetwork.Instance.Nodes.Count + 1).ToString("D3"),
RoadNetwork.Instance.transform.FindChild("Nodes"));
rn.Position = new Vector3(x, y, z);
rn.gameObject.active = true;
return rn;
}
RoadNetwork中适当的方法是:
public RoadNode2 GetNodeAtPosition(Vector3 position)
{
var tempList = new List<RoadNode2>();
return tempList.Single(x => x.Position == position);
}
tempList试图缩小问题的范围,但是我得到了完全相同的错误。它应该是“Nodes.Single(...)”,但我怀疑这很重要。如果直接在New()方法中调用Linq查询,则会收到相同的错误。
所以是的,此异常引发并指向该tempList.Single()行。原因是什么?
最佳答案
如果someEnumerable.Single(...)
中不存在一个完全正确的元素,则someEnumerable
会引发异常。假设您刚刚将tempList
声明为空列表,它将始终引发异常。
如果要在没有元素的情况下检索null
,请使用SingleOrDefault
。 (如果可枚举包含多个元素,这仍将引发异常。)如果您想要第一个元素,以便允许您的可枚举包含任何数量的元素,请使用First
(如果可枚举不包含任何元素,则引发异常)或FirstOrDefault
(在这种情况下,返回null
)。
最后,如果您只想检查列表中是否有任何与给定谓词匹配的元素,请使用Any
。
关于c# - 由于对象的当前状态,操作无效-List上的Linq,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3921058/