在列表上运行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/

10-10 20:16