2011-02-26 65 views
5

Tôi đã đăng câu hỏi này một lúc trước nhưng có một câu trả lời một phần cho vấn đề của tôi, vì vậy tôi nghĩ tôi đăng thêm lời giải thích hy vọng sẽ nhận được câu trả lời chính xác hơn. Tôi có 2 lớp:Lambda với các lớp lồng nhau

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

Tôi đang cố gắng để có được chỉ Tất cả nhân viên có xe tải được phân bổ để bỏ qua những người có SmallCars sử dụng Lambda, tôi đã cố gắng dòng này:

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

Nhưng điều này được tất cả nhân viên nếu ít nhất một van được cấp cho một nhân viên (.Any) nếu tôi thử (.All), nó sẽ mang lại không có gì là không phải tất cả nhân viên đều có Vân.

Bất kỳ ý tưởng nào nếu điều này có thể đạt được bằng cách sử dụng Lambda lồng nhau?

Cảm ơn.

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

Có vẻ như cô ấy muốn Nhân viên không có xe hơi nhỏ ... –

+0

bạn chưa đề cập đến 'carID' vv .. tuy nhiên tôi đã chỉnh sửa câu trả lời theo Bản cập nhật của bạn .. –

Trả lời

2

Hãy thử điều này Thay vào đó:

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

Đây là những gì tôi đã cố gắng (Trong 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(); 
} 

Output:

enter image description here

+0

điều này sẽ trả lại tất cả nhân viên những người ** không ** có một chiếc xe tải - Tôi không nghĩ rằng đó là những gì OP muốn – BrokenGlass

+0

yeah tôi đã chỉ cố gắng nó và thấy rằng .. đã thay đổi mã của tôi .. Thanx cho chỉ ra –

+0

@maya: Tôi đã cập nhật câu trả lời của tôi theo bản cập nhật của bạn –

0

Đây có phải là những gì bạn muốn không? (Tất cả các nhân viên có ít nhất một chiếc xe, nhưng không có smallcar)

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

Truy vấn là đúng, nó sẽ thêm một Employee đến chuỗi trở lại nếu nó được gán một chiếc xe tải. Tôi không hoàn toàn chắc chắn câu hỏi nằm ở đâu, bạn có nghĩ rằng truy vấn của bạn sẽ không trả lại gì vì không phải tất cả nhân viên đều có xe tải? Nếu có, đây sẽ là việc thực hiện một hành Where:

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

Các vị sẽ được áp dụng cho tất cả các yếu tố theo thứ tự của bạn, nếu phần tử thực hiện tốt điều đó, nó sẽ được trả lại như là một phần của dãy.

+0

@BrokenGlass @Femaref @Shekhar_Pro Tôi đã thêm ví dụ vào câu hỏi, có ý nghĩa không, đầu ra của danh sách Nhân viên mới với các mặt hàng nhân viên chứa xe hơi loại van chỉ được thêm vào? – Maya

Các vấn đề liên quan