2016-05-16 78 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

相关问题