Jaime
Jaime

Reputation: 605

C# Lambda Expression not returning expected result

I am using a lamda expression to filter a query.

Basically, I have lines that are composed of segments and these segments are marked as deleted, inserted or null.

What I want returned are segments that have been marked as deleted but whose any sibling IS NOT marked as deleted. As an example,

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

Should return me Segment 1. But the next example,

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)

Should not return any segments. See code below:

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

Thanks and I appreciate any help or suggestion as to why this is not working.

Upvotes: 4

Views: 675

Answers (3)

Jaime
Jaime

Reputation: 605

Since ModType is nullable, it did not return what I was expecting. The code should be...

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

Thanks to all those who replied and gave comments and suggestions!

Upvotes: 0

Bryan Rowe
Bryan Rowe

Reputation: 9303

I'd think it would be something like:

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

Upvotes: 2

virsum
virsum

Reputation: 243

Instead of Any(), use Where(), which will return you an IEnumerable object. Like Jon says, Any() returns a boolean.

Upvotes: 0

Related Questions