由于对象的当前状态 - 列表上的Linq,操作无效

Geo*_*e R 5 c# linq unity-game-engine

在List上运行Linq查询时抛出此错误.

我正在使用带有C#的Unity3D 3.0(Unity3D使用Mono 2.6).据我所知,Unity3D是单线程的.它的工作原理是将继承基类的"脚本"(c#.cs文件)附加到"GameObject".此外,Unity控制脚本的实例化和序列化,因此您不能使用构造函数.

我有一个RoadNetwork脚本,其中包含对RoadNodes和RoadCurves的引用,两者都通过单例定位RoadNetwork并注册/取消注册.我在RoadNode和RoadCurve中安装了"迷你工厂",他们努力将自己挂在游戏对象上.

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;
}
Run Code Online (Sandbox Code Playgroud)

RoadNetwork中的适当方法是:

public RoadNode2 GetNodeAtPosition(Vector3 position)
{
    var tempList = new List<RoadNode2>();

    return tempList.Single(x => x.Position == position);
}
Run Code Online (Sandbox Code Playgroud)

tempList试图缩小问题范围,但我得到了完全相同的错误.它应该是"Nodes.Single(...",但我怀疑它很重要.如果我直接在New()方法中调用Linq查询,我会得到相同的错误.

所以是的,这个Exception会抛出并指向我的tempList.Single()行.原因是什么?

Dom*_*nic 15

someEnumerable.Single(...)如果没有一个元素,则抛出异常someEnumerable.鉴于您刚刚声明tempList为空列表,它将始终抛出异常.

如果要检索null是否没有元素,请使用SingleOrDefault.(如果可枚举包含多个元素,这仍然会抛出异常.)如果您想要第一个元素,以便允许您的枚举包含任意数量的元素,请使用First(如果枚举不包含任何元素,则抛出异常)或FirstOrDefault(null在这种情况下返回).

最后,如果您只想检查列表中是否存在与给定谓词匹配的任何元素,请使用Any.

  • 如果您不发布确切的错误,很难帮助您.另外,根据http://msdn.microsoft.com/en-us/library/bb155325.aspx,在一个不具有一个元素的枚举上使用`Single`的结果是`InvalidOperationException`,而不是任何类型的null引用例外. (3认同)