2010-03-08 5 views
1

J'ai une exception étrange lorsque j'essaie de savoir si une propriété dans une liste d'objets est égale pour tous les objets.La collection a été modifiée exception linq-to-objects

Ceci est mon code:

bool lvNoGuests = pvBillData.Reservering.Dagen.All(x => 
{ 
    return x.AantalKinderen == pvBillData.Reservering.Dagen[0].AantalKinderen && 
      x.AantalVolwassenen == pvBillData.Reservering.Dagen[0].AantalVolwassenen 
}); 

L'idée est d'utiliser le .Toutes pour voir si tous les membres de la liste ont la même valeur pour les deux propriétés que la première entrée dans la liste.

Les propriétés sont des getters simples (pas la propriété auto) et ne modifient rien.

Lorsque j'exécute ce code, j'obtiens une exception InvalidOperationException "La collection a été modifiée, l'opération d'énumération peut ne pas s'exécuter".

Quelqu'un a une idée pourquoi?

Les listes ne sont pas des listes genericht .net mais sont de type XPCollection (framework XPO de DevExpress).

+0

Vous n'êtes donc pas traiter à des objets, mais LINQ avec la mise en œuvre DevExpress XPO LINQ? – Steven

+0

Je ne suis pas sûr de linq, mais je pense que c'est un linq-to-objects ordinaire, puisque je n'interroge pas la base de données à la volée avec linq, mais j'interroge les obejcts XPO en cache. Qui sont en interne certaines listes de fantaisie avec la mise en cache et le rechargement de DB. – Henri

Répondre

3

Est-tout un getter simple? Même Dagen? Je peux seulement supposer que quelque chose de funky se passe (peut-être avec la création de type dynamique et les substitutions silencieuses que vous ne voyez pas dans votre code - sont les membres virtual?). Cependant, pour fixer, je voudrais essayer saisir les détails dans les variables:

var first = pvBillData.Reservering.Dagen.First(); 
var kinderen = first.AantalKinderen; 
var volwassenen = first.AantalVolwassenen; 
bool lvNoGuests = pvBillData.Reservering.Dagen.All(
    x => x.AantalKinderen == kinderen && x.AantalVolwassenen == volwassenen); 
+0

Désolé Marc, je vous ai battu sur celui-ci ;-) – Steven

+0

@Steven - en effet (+1), mais j'ai au moins offert quelques réflexions sur ce qui pourrait se passer, et simplifié le lambda ;-p –

+0

.Dagen avait en effet une condition dans le getter qui a provoqué le rechargement de la liste à partir de la base de données. @Steven, désolé bien que vous et Marc disiez la même chose, je vais lui donner les points "répondus" car il était un peu plus explicite. – Henri

3

Essayez ceci:

var eersteDag = pvBillData.Reservering.Dagen[0]; 
var verwachtAantalKinderen = eersteDag.AantalKinderen; 
var verwachtAantalVolwassenen = eersteDag.AantalVolwassenen; 

bool lvNoGuests = pvBillData.Reservering.Dagen.All(x => 
{ 
    return x.AantalKinderen == verwachtAantalKinderen && 
      x.AantalVolwassenen == verwachtAantalVolwassenen 
}); 
Questions connexes