L'opération n'est pas valide en raison de l'état actuel de l'objet - Linq sur la Liste
Cette erreur est levée lors de l'exécution d'une requête Linq sur une Liste.
Je suis avec Unity3D 3.0 avec C# (Unity3D utilise Mono 2.6). Unity3D, autant que je sache, est mono-thread. Il fonctionne en fixant des "scripts" (c# .fichiers cs) qui héritent d'un baseclass, à un "GameObject". Aussi, l'Unité contrôle de l'instanciation et la sérialisation des scripts de sorte que vous ne pouvez pas utiliser des constructeurs.
J'ai un RoadNetwork script qui contient une référence à RoadNodes et RoadCurves, qui recherchez RoadNetwork par l'intermédiaire d'un singleton et s'inscrire/se désabonner. J'ai mis "mini-usines" dans Ğroadnodeğ et RoadCurve que de faire le travail de l'accrochage elles-mêmes jusqu'à un gameobject.
Ğroadnodeğ vérifie d'abord avec RoadNetwork assurez-vous qu'il n'est pas déjà un nœud à la même position, en faisant ceci:
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;
}
Où la méthode appropriée dans RoadNetwork est:
public RoadNode2 GetNodeAtPosition(Vector3 position)
{
var tempList = new List<RoadNode2>();
return tempList.Single(x => x.Position == position);
}
tempList eu une tentative de circonscrire le problème mais j'ai exactement la même erreur. Il devrait être Nœuds.Seul(...", mais j'en doute des questions. Je reçois la même erreur si je l'appelle la requête Linq directement dans la méthode New ().
Alors oui, cette Exception jette et des points de moi pour que tempList.Unique() de la ligne. Quelle serait la raison d'être?
Vous devez vous connecter pour publier un commentaire.
someEnumerable.Single(...)
lève une exception si il n'est pas exactement un élément desomeEnumerable
. Étant donné que vous venez déclarétempList
à une liste vide, il sera toujours lancer une exception.Si vous voulez récupérer
null
si il n'y a pas d'éléments, utilisezSingleOrDefault
. (Cela va lever une exception si l'énumération contient plus qu'un élément.) Si vous voulez le première élément, de sorte que votre énumérable est autorisé à contenir n'importe quel nombre d'éléments, l'utilisationFirst
() lève une exception si l'énumération contient pas d'éléments) ouFirstOrDefault
(renvoienull
dans le cas).Enfin, si vous souhaitez simplement vérifier s'il y a des éléments d'une liste correspondant à un prédicat donné, l'utilisation
Any
.Single
sur une énumération avec pas exactement un élément est unInvalidOperationException
, pas n'importe quel type de référence nulle exception.collection.First()
dans LINQ. Changer de.FirstOrDefault
il fixe. Le "OrDefault" versions du LINQ méthodes sont toujours une valeur sûre, il me semble.Je pense que Dominique voulais dire c'est que .Unique() renvoie une erreur à chaque fois que plus d'un élément correspond à votre prédicat. Votre collection someEnumerable doivent contenir des copies de ce singleton (pas le modèle de programmation) que vous essayez de récupérer.
Il sonne comme il y a un problème avec la façon dont vous êtes à la mise en œuvre du pattern singleton dans l'Unité. Si vous êtes l'obtention d'une référence null exception lors de la vérification d'une liste qui signifient la liste n'a pas été initialisé, alors, vous êtes probablement pas l'instanciation de la singleton ou votre accédant pas au singleton vous instancié.
J'ai l'habitude d'utiliser un singleton MonoBehaviour attaché à un GameObject qui instancie et initialise lors du premier accès comme ceci:
http://answers.unity3d.com/questions/156746/singleton-and-monobehaviour-in-editor.html