2009-11-11 5 views
2

Il me manque clairement quelque chose ici ... J'ai une liste générique d'objets et j'essaie d'utiliser une expression lambda pour supprimer des éléments. Lorsque j'utilise le code affiché ci-dessous, je reçois l'exception suivante.Generic List EnleverAll expressions et lambda

System.InvalidOperationException: séquence ne contient aucun élément correspondant

public class MyObject { 
    public Guid ID1 {get;set;} 
    public int ID2 {get;set;} 
} 

public class MyContainer{ 
    List<MyObject> myList = new List<MyObject>(); 

    public MyObject Get(Guid id1) { 
     return myList.Single(mo => mo.ID1 == id1); 
    } 

    public void AddItem(MyObject item) { 
     myList.Add(item); 
    } 

    public int RemoveItems(MyObject item) { 
     return myList.RemoveAll(mo => mo.ID1 == item.ID1 || mo.ID2 == item.ID2); 
    } 
} 

Suis-je fait une erreur en utilisant un lambda?

[EDIT] Eh bien, un flop pour la première question. J'ai mal lu la trace de la pile, après avoir enlevé l'élément dans mon test unitaire j'ai essayé d'appeler la méthode Get() et dans mon "pourquoi est-ce déjà sombre" rage a sauté l'arme en postant une question sans analyse appropriée. Pardon.

+1

Vous devez poster plus de code ... le code que vous avez posté ne causerait pas cette exception .... –

Répondre

1

"Sequence contains no matching element" est plus une chose First(predicate) ou Single(predicate) ... Je ne soupçonniez pas voir cela de RemoveAll. Êtes-vous sûr c'est dans le code affiché?

La ligne:

new MyContainer().RemoveItems(new MyObject { ID1 = Guid.Empty, ID2 = 2 }); 

fonctionne sans erreur. Je me demande si vous appelez quelque chose comme:

col.RemoveItems(someQuery.Single(predicate)); 

et il arrive que someQuery est vide.

0

Il semble que vous ne supprimiez que le seul objet MyObject transmis dans la méthode. Si c'est le cas, vous pouvez modifier votre code pour dire myList.Remove par opposition à myList.RemoveAll

0

Je suppose que vous essayez de couvrir le cas où plusieurs éléments avec le même ID apparaissent dans la liste (sinon, utilisez simplement Supprimer). Si oui, essayez de les stocker lambda comme:

Expression<Func<MyObject, bool>> pred = (mo) => mo.ID1 == item.ID1 || mo.ID2 == item.ID2 

et seulement appeler myList.RemoveAll (pred) si myList.Any (pred) est vrai.