2016-05-16 80 views
0

我正在爲加拿大石油營地開展緊急監測工具,所以下面的例子非常簡單。不過,我認爲這一點很重要。基於在它之前設置的另一個值,在lambda表達式中設置一個值?

我的目標是避免代碼重複並清理我的lambda類型轉換。

例如,而不是這樣的:

var dto = results.Select(x => new DTO() 
       { 
        Unoccupied = !(x.RoomStatusType == "Checked In" || x.RoomStatusType == "No Sleep"), 
        SwipeTime = x.RoomStatusType == "Checked In" || x.RoomStatusType == "No Sleep" ? x.SwipeTime : null, 
        Mustered = (x.RoomStatusType == "Checked In" || x.RoomStatusType == "No Sleep") && x.SwipeTime != null 
       }).ToList(); 

我想做到這一點:

var dto = results.Select(x => new DTO() 
       { 
        Unoccupied = !(x.RoomStatusType == "Checked In" || x.RoomStatusType == "No Sleep"), 
        SwipeTime = Unoccupied ? null : x.SwipeTime, 
        Mustered = !Unoccupied && SwipeTime != null 
       }).ToList(); 

然而,在後者的實施方式我得到的錯誤,指出

名稱在當前上下文中{{'Unoccupied'或'SwypeTime'}分別不存在 。

我覺得這個莫名其妙,因爲兩者似乎都存在於lambda表達式的上下文中。在諸如「this.Unoccupied」或「dto.Unoccupied」之前添加前綴當然沒有用處。這真的讓我很失望!

+0

你可以使用'let',LINQ使用起來更容易。 – leppie

+0

我的上帝堆棧溢出已經變快了!我已經準備好發佈它並開始進行其他工作,但是它實際上是實時解決的。 – Methodician

回答

4

一種方法是使用本地變量:

var dto = results.Select(x => 
    { 
     var unoccupied = !(x.RoomStatusType == "Checked In" || x.RoomStatusType == "No Sleep"); 
     var swipeTime = unoccupied ? null : x.SwipeTime; 
     return new DTO() 
      { 
       Unoccupied = unoccupied, 
       SwipeTime = swipeTime, 
       Mustered = !unoccupied && swipeTime != null 
      }; 
    }).ToList(); 
+0

我喜歡這個,可能會在多行中使用它,只是爲了塊的乾淨和可讀性。但是,我必須建議編輯以符合邏輯。 – Methodician

+0

@Methodician現在應該修復。我介紹了第二個變量。 – itsme86

+0

是的,你明白了。 – Methodician

1

定義Unoccupied,SwipeTime和Mustered的行不是單獨的語句。它們是單個對象初始化語句的一部分。這些任務權利的價值觀已經在範圍之內。

你可以重寫與每個屬性分別賦值語句多行的Lambda表達式,例如:

var dtoList = results.Select(x => { 
    var dto = new DTO(); 
    dto.Unoccupied = !(x.RoomStatusType == "Checked In" || x.RoomStatusType == "No Sleep"); 
    dto.SwipeTime = dto.Unoccupied ? null : x.SwipeTime; 
    dto.Mustered = !dto.Unoccupied && dto.SwipeTime != null; 
    return dto; 
}).ToList(); 
+0

很酷,看起來像我看到的,其他人提供了一個這樣的例子,然後立即刪除它!你能提供一個例子嗎? – Methodician

+0

我已經添加了一個示例。這是你的代碼試圖做的最接近的事情,但我認爲它的me86的答案更好。 – hgcummings

+0

是的,我不確定哪一個我其實更喜歡,但我認爲可讀性對局部變量更好。但是,他錯過了一個位置,所以我會建議對他進行編輯,並在選擇答案之前從中收到更多點贊。 – Methodician

相關問題