2009-08-21 8 views
4

J'utilise une expression lamda pour filtrer une requête.C# Lambda Expression ne renvoyant pas le résultat attendu

Fondamentalement, j'ai des lignes qui sont composées de segments et ces segments sont marqués comme supprimés, insérés ou null.

Ce que je veux retourner sont les segments qui ont été marqués comme supprimés mais dont les frères et sœurs N'EST PAS marqué comme supprimé. À titre d'exemple,

Line: "Soylent Green is people!" Broken into 2 segments... 
Segment 1: "Soylent Green " (marked as deleted) 
Segment 2: "is people!" (not marked as deleted) 

devrait me revenir Segment 1. Mais l'exemple suivant,

Line: "Open the pod bay doors Hal!" Broken into 3 segments... 
Segment 1: "Open the " (marked as deleted) 
Segment 2: "pod bay " (marked as deleted) 
Segment 3: "doors Hal!" (marked as deleted) 

de ne pas retourner tous les segments. Voir le code ci-dessous:

return seg => seg.ModType == Deleted && 
       seg.Line.Segments.Any(segs => segs.ID != seg.ID && 
       segs.ModType != Deleted); 

Merci et je vous remercie de toute aide ou suggestion pourquoi cela ne fonctionne pas.

+2

Vous ne nous avez pas montré assez pour dire vraiment. Quel est le "ID" ici? Veuillez fournir un programme court mais * complet * pour démontrer le problème. Je soupçonne dès que nous pouvons le reproduire, nous trouverons le problème facilement. Je * suggérerais qu'avoir "seg" et "segs" est une recette pour la confusion. –

+0

Etes-vous certain que la collection Line.Segments est correcte? – womp

+0

Veuillez publier un programme complet, mais court, qui peut être compilé et exécuté pour reproduire votre problème. Cela nous aidera à vous aider en nous donnant du code que nous pourrons déboguer et modifier afin d'obtenir les résultats souhaités. –

Répondre

0

Puisque ModType est nullable, il n'a pas retourné ce que je m'attendais. Le code doit être ...

return seg => seg.ModType == Deleted && 
      seg.Line.Segments.Any(segs => segs.ID != seg.ID && 
      (segs.ModType != Deleted || segs.ModType == null)); 

Merci à tous ceux qui ont répondu et ont donné des commentaires et suggestions!

2

Je pense que ce serait quelque chose comme:

return s => from segment in s.Line.Segments 
      where segment.ModType == Deleted 
       && segment.Line.Segments.Any(segs => segs.ModType != Deleted) 
      select segment 
+1

'Any' renvoie un' bool', pas une collection. –

+0

Mise à jour, merci Jon. –

+0

Cela retournera une expression Lambda qui sera utilisée dans une requête. – Jaime

0

au lieu de toute(), utilisation Où(), qui vous renvoie un objet IEnumerable. Comme Jon dit, Any() renvoie un booléen.

Questions connexes