2009-08-21 11 views
4

Ich verwende einen Lambda-Ausdruck, um eine Abfrage zu filtern.C# Lambda Ausdruck liefert kein erwartetes Ergebnis

Grundsätzlich habe ich Zeilen, die aus Segmenten bestehen und diese Segmente als gelöscht, eingefügt oder null markiert sind.

Was ich zurückgeben möchte, sind Segmente, die als gelöscht markiert wurden, aber deren Geschwister NICHT als gelöscht gekennzeichnet sind. Als Beispiel

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

Sollte ich zurück Segment 1. Aber das nächste Beispiel

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) 

keine Segmente zurückkehren. Siehe Code unten:

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

Dank und ich schätze jede Hilfe oder einen Vorschlag, warum dies nicht funktioniert.

+2

Sie haben uns nicht genug gezeigt, um wirklich zu erzählen. Was ist die "ID" hier? Bitte geben Sie ein kurzes, aber * vollständiges * Programm an, um das Problem zu demonstrieren. Ich vermute, sobald wir es reproduzieren können, werden wir das Problem leicht finden. Ich würde vorschlagen, dass "seg" und "segs" ein Rezept für Verwirrung ist. –

+0

Sind Sie sicher, dass die Line.Segments-Sammlung korrekt ist? – womp

+0

Bitte posten Sie ein vollständiges, aber kurzes Programm, das kompiliert und ausgeführt werden kann, um Ihr Problem zu reproduzieren. Dies hilft uns dabei, Ihnen Code zu geben, den wir debuggen und optimieren können, um die gewünschten Ergebnisse zu erzielen. –

Antwort

0

Da ModType nullfähig ist, gab es nicht das zurück, was ich erwartet hatte. Der Code sollte ... sein

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

Dank an alle, die geantwortet und gab Kommentare und Anregungen!

2

Ich denke, es wäre so etwas wie wäre:

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

'Any' gibt einen' bool' zurück, keine Sammlung. –

+0

Aktualisiert, danke Jon. –

+0

Dies wird einen Lambda-Ausdruck zurückgeben, der in einer Abfrage verwendet wird. – Jaime

0

Statt Any(), verwenden Sie Wo(), die Sie ein IEnumerable-Objekt zurück. Wie Jon sagt, gibt Any() einen booleschen Wert zurück.

Verwandte Themen