基于在它之前设置的另一个值,在lambda表达式中设置一个值?
我正在为加拿大石油营地开展紧急监测工具,所以下面的例子非常简单。不过,我认为这一点很重要。基于在它之前设置的另一个值,在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”之前添加前缀当然没有用处。这真的让我很失望!
一种方法是使用本地变量:
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();
我喜欢这个,可能会在多行中使用它,只是为了块的干净和可读性。但是,我必须建议编辑以符合逻辑。 – Methodician
@Methodician现在应该修复。我介绍了第二个变量。 – itsme86
是的,你明白了。 – Methodician
定义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();
很酷,看起来像我看到的,其他人提供了一个这样的例子,然后立即删除它!你能提供一个例子吗? – Methodician
我已经添加了一个示例。这是你的代码试图做的最接近的事情,但我认为它的me86的答案更好。 – hgcummings
是的,我不确定哪一个我其实更喜欢,但我认为可读性对局部变量更好。但是,他错过了一个位置,所以我会建议对他进行编辑,并在选择答案之前从中收到更多点赞。 – Methodician
你可以使用'let',LINQ使用起来更容易。 – leppie
我的上帝堆栈溢出已经变快了!我已经准备好发布它并开始进行其他工作,但是它实际上是实时解决的。 – Methodician