C# 根据之前设置的另一个值在lambda表达式中设置一个值?

C# 根据之前设置的另一个值在lambda表达式中设置一个值?,c#,lambda,C#,Lambda,我正在为加拿大石油营地开发一个紧急监控工具,所以下面的例子非常简单。然而,我认为这一点已经被理解了 我的目标是避免代码重复并清理lambda类型转换 例如,与此不同的是: var dto = results.Select(x => new DTO() { Unoccupied = !(x.RoomStatusType == "Checked In" || x.RoomStatusType == "No Sleep"),

我正在为加拿大石油营地开发一个紧急监控工具,所以下面的例子非常简单。然而,我认为这一点已经被理解了

我的目标是避免代码重复并清理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.unoccubited”或“dto.unoccubited”这样的前缀并没有什么好处。这真让我沮丧

定义未占用、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();

定义未占用、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();

一种方法是使用局部变量:

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();

一种方法是使用局部变量:

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();

使用LINQ,使用
let
,您可以更轻松地完成这项工作。我的上帝堆栈溢出速度很快!我已经准备好发布这篇文章并着手做其他事情,但它实际上是实时解决的。使用LINQ,使用
let
,你可以更轻松地做到这一点。我的上帝堆栈溢出速度很快!我已经准备好发布这篇文章,然后去做其他的事情,但它实际上是实时解决的。酷,就像我看到的,其他人提供了一个例子,然后立即删除了它!你能举个例子吗?我加了一个例子。这是最接近您的代码试图做的事情,但我认为itsme86的答案读起来更好。是的,我不确定我更喜欢哪一个,但我确实认为局部变量的可读性更好。然而,他错过了一个点,所以我会建议编辑他的,并在选择答案之前从中获得更多的选票。酷,就像我看到的,其他人提供了一个例子,然后立即删除了它!你能举个例子吗?我加了一个例子。这是最接近您的代码试图做的事情,但我认为itsme86的答案读起来更好。是的,我不确定我更喜欢哪一个,但我确实认为局部变量的可读性更好。然而,他错过了一个点,所以我会建议对他进行编辑,并从中得到提示,在选择答案之前获得更多的投票。我喜欢这一点,可能会在多行上使用它,只是为了块的干净和可读性。不过,我必须建议编辑以符合逻辑。@Methodician现在应该得到修复。我引入了第二个变量。我喜欢这个,并且可能会在多行上使用它,只是为了块的干净和可读性。不过,我必须建议编辑以符合逻辑。@Methodician现在应该得到修复。我引入了第二个变量。