【问题标题】:Lambda with nested classes带有嵌套类的 Lambda
【发布时间】:2011-02-26 22:32:38
【问题描述】:

我刚刚发布了这个问题,但得到了我的问题的部分答案,所以我想我发布更多解释,希望得到更准确的答案。我有 2 节课:

public class Employee
{
    public string Name { get; set; }
    public List<Cars> Cars { get; set; }
}

public class Car
{
    public int CarID { get; set; }
    public CarTypes CarType { get; set; }
    public enum CarTypes
    {
        Van,
        SmallCar
    }
}

我试图让所有分配有货车的员工忽略那些使用 Lambda 的 SmallCars 的员工,我尝试了这条线:

List<Employee> EmployeesWithVans = AllEmployees.Where(emps => emps.Car.Any(cartype => cartype.CarType == Car.CarTypes.Van)).ToList();

但是,如果我尝试 (.All) 将至少一辆面包车分配给员工 (.Any),这将吸引所有员工,因为并非所有员工都有面包车。

知道这是否可以使用嵌套的 Lambda 实现吗?

谢谢。

编辑:

Employee Mark = new Employee();
Mark.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 12 });
Mark.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 13 });
Mark.Cars.Add(new Car() { CarType = Car.CarTypes.SmallCar, CarID = 14 });

Employee Lisa = new Employee();
Lisa.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 15 });
Lisa.Cars.Add(new Car() { CarType = Car.CarTypes.SmallCar, CarID = 16 });
Lisa.Cars.Add(new Car() { CarType = Car.CarTypes.SmallCar, CarID = 17 });

    List<Employee> EmployeesWithVans should contain:

    Employee FilteredMark contains:
    Mark.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 12 });
    Mark.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 13 });

    Employee FilteredLisa contains:
    Mark.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 15 });

【问题讨论】:

  • 看起来她想要没有小型汽车的员工......
  • 你没有提到carID 等。但是我已经根据你的更新编辑了我的答案..

标签: c# linq .net-4.0 lambda nested-class


【解决方案1】:

试试这个吧:

List<Employee> Temp = AllEmployees.Where(emps => emps.Cars.Any(cartype => cartype.CarType == Cars.CarTypes.Van)).ToList();

List<Employee> EmployeesWithVans = (from item in Temp
           select new Employee{ 
                                     Name = item.Name, 
                                     Cars = (item.Cars.Where( car => car.CarType == Cars.CarTypes.Van)).ToList()
                               }).ToList();

这是我尝试过的(在 LINQPAD 中):

void Main()
{
    List<Employee> AllEmployees = new List<Employee>();

    List<Cars> lcars1 = new List<Cars>();
    Cars car1 = new Cars();
    car1.CarType = Cars.CarTypes.Van;
    lcars1.Add(car1);lcars1.Add(car1);

    Cars car2 = new Cars();
    car2.CarType = Cars.CarTypes.SmallCar;
    lcars1.Add(car2);

    List<Cars> lcars2 = new List<Cars>();
    lcars2.Add(car1);lcars2.Add(car2);lcars2.Add(car2);

    AllEmployees.Add(new Employee(){ Name="emp1", Cars = lcars1});
    AllEmployees.Add(new Employee(){ Name="emp2", Cars = lcars2});
    AllEmployees.Add(new Employee(){ Name="emp3", Cars = lcars1 });
    AllEmployees.Add(new Employee(){ Name="emp4", Cars = lcars2});

    List<Employee> Temp = AllEmployees.Where(emps => emps.Cars.Any(cartype => cartype.CarType == Cars.CarTypes.Van)).ToList();

    List<Employee> EmployeesWithVans = (from item in Temp
            select new Employee{ 
                                        Name = item.Name, 
                                        Cars = (item.Cars.Where( car => car.CarType == Cars.CarTypes.Van)).ToList()
                                }).ToList();

    EmployeesWithVans.Dump();
}

输出:

【讨论】:

  • 这将返回所有没有有货车的员工 - 我认为这不是 OP 想要的
  • 是的,我只是在尝试,发现.. 更改了我的代码.. 感谢您指出这一点
  • 啊,你是明星!非常感谢你应该得到一个大的 +1,对于我只需要添加一些对象识别的 CarID 混淆抱歉。
  • 没问题...很高兴能帮到你..:)
【解决方案2】:

这是你想要的吗? (所有员工至少有一辆面包车,但没有小型车)

var EmployeesWithVans = AllEmployees
                        .Where(emps => emps.Cars.Any(cartype => cartype.CarType == Cars.CarTypes.Van)
                                       && !emps.Cars.Any(cartype => cartype.CarType == Cars.CarTypes.SmallCar))
                        .ToList();

【讨论】:

    【解决方案3】:

    查询是正确的,如果它被分配了一辆货车,它会在返回序列中添加一个Employee。我不太确定问题出在哪里,您是否认为您的查询不会返回任何内容,因为并非所有员工都有面包车?如果是,这将是 Where 运算符的实现:

    foreach(var elem in input)
    {
      if (predicate(elem))
        yield return elem;
    }
    

    谓词将应用于序列中的所有元素,如果元素满足它,它将作为序列的一部分返回。

    【讨论】:

    猜你喜欢
    • 2021-07-15
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2019-05-25
    相关资源
    最近更新 更多