2009-08-21 82 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()返回一個布爾值。