gpt4 book ai didi

c# - 由于对象的当前状态,操作无效 - Linq on List

转载 作者:太空狗 更新时间:2023-10-29 22:12:59 25 4
gpt4 key购买 nike

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

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# - 由于对象的当前状态,操作无效 - Linq on List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3921058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com