2009-08-21 83 views
4

我正在使用lamda表达式筛选查询。C#Lambda表达式不返回预期结果

基本上,我有行由段组成,这些段标记为删除,插入或空。

我想要返回的是已标记为已删除但其任何兄弟没有标记为已删除的段。作为一个例子,

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

应该返回我段1,但下面的例子中,

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) 

应该不会返回任何段。请参见下面的代码:

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

谢谢,我感谢所有帮助或建议,为什么这是行不通的。

+2

你还没有向我们展示足够的真实。这里的“身份证”是什么?请提供简短但完整的*程序来演示此问题。我怀疑,只要我们能够重现它,我们会很容易地找到问题。我*会*建议拥有“seg”和“segs”是混淆的秘诀。 – 2009-08-21 18:41:02

+0

你确定Line.Segments集合是正确的吗? – womp 2009-08-21 18:42:14

+0

请发布一个完整但简短的程序,该程序可以被编译和执行以重现您的问题。这将帮助我们为您提供帮助,方法是向我们提供可调试和调整的代码,以便获得理想的结果。 – 2009-08-21 18:43:18

回答

0

由于ModType为空,它没有返回我所期望的。该代码应该是...

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

感谢所有谁回答,给了意见和建议!

2

我认为这将是这样的:

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

'任何'都会返回一个'bool',而不是一个集合。 – 2009-08-21 18:48:38

+0

更新,谢谢乔恩。 – 2009-08-21 19:03:33

+0

这将返回一个将在查询中使用的Lambda表达式。 – Jaime 2009-08-21 19:37:18

0

而不是任何(),使用Where(),这将返回一个IEnumerable对象。像Jon说的,Any()返回一个布尔值。