Лямбда с вложенными классами - PullRequest
6 голосов
/ 27 февраля 2011

Я опубликовал этот вопрос некоторое время назад, но получил частичный ответ на свой вопрос, поэтому я решил опубликовать более подробное объяснение в надежде получить более точный ответ. У меня 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
    }
}

Я пытаюсь получить только всех сотрудников, у которых есть микроавтобусы, которые игнорируют тех, у кого SmallCars используют Lambda, я попробовал эту строку:

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

Но это получает всех сотрудников, если хотя бы один фургон выделен Сотруднику (.Any), если я попытаюсь (.All), это ничего не вернет, поскольку не у всех сотрудников есть Ван.

Есть идеи, если этого можно достичь с помощью вложенной лямбды?

Спасибо.

Edit:

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

Ответы [ 3 ]

2 голосов
/ 27 февраля 2011

Попробуйте вместо этого:

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

Выход:

enter image description here

0 голосов
/ 27 февраля 2011

Запрос правильный, он добавляет Employee к последовательности возврата, если ему назначен фургон.Я не совсем уверен, в чем вопрос. Как вы думаете, ваш запрос ничего не даст, поскольку не у всех сотрудников есть фургон?Если да, это будет реализация оператора Where:

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

Предикат будет применен ко всем элементам вашей последовательности, если элемент его выполняет, он будет возвращен как частьпоследовательность.

0 голосов
/ 27 февраля 2011

Это то, что вы хотите?(все сотрудники с хотя бы одним фургоном, но без легкового автомобиля)

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