net 中的.GroupJoin方法
1.作用:可以在一个可枚举序列中根据一个共同的键将其分组
class Person { public int Id { get; set; } public string Name { get; set; } } class Pet { public int OwnerId { get; set; } public string Name { get; set; } } List<Person> people = new List<Person> { new Person { Id = 1, Name = "Alice" }, new Person { Id = 2, Name = "Bob" } }; List<Pet> pets = new List<Pet> { new Pet { OwnerId = 1, Name = "Fluffy" }, new Pet { OwnerId = 1, Name = "Spot" }, new Pet { OwnerId = 2, Name = "Mittens" } }; var query = people.GroupJoin(pets, person => person.Id, pet => pet.OwnerId, (person, petList) => new { Person = person, Pets = petList }); foreach (var item in query) { Console.WriteLine("{0}: {1}", item.Person.Name, string.Join(", ", item.Pets.Select(pet => pet.Name))); } // Output: // Alice: Fluffy, Spot // Bob: Mittens
举例二:
class Program { static void Main(string[] args) { var students = new List<Student> { new Student { Id = 1, Name = "Alice" }, new Student { Id = 2, Name = "Bob" }, new Student { Id = 3, Name = "Charlie" } }; var courses = new List<Course> { new Course { Id = 1, Name = "Math" }, new Course { Id = 2, Name = "Science" }, new Course { Id = 3, Name = "History" }, new Course { Id = 4, Name = "English" } }; var enrollments = new List<Enrollment> { new Enrollment { StudentId = 1, CourseId = 1 }, new Enrollment { StudentId = 1, CourseId = 2 }, new Enrollment { StudentId = 2, CourseId = 1 }, new Enrollment { StudentId = 2, CourseId = 3 }, new Enrollment { StudentId = 3, CourseId = 2 }, new Enrollment { StudentId = 3, CourseId = 4 } }; var query = students.GroupJoin( enrollments, student => student.Id, enrollment => enrollment.StudentId, (student, enrollments) => new { StudentName = student.Name, Courses = enrollments.Join( courses, enrollment => enrollment.CourseId, course => course.Id, (enrollment, course) => course.Name) }); /*输出结果 Alice: Math, Science Bob: Math, History Charlie: Science, English */ foreach (var result in query) { Console.WriteLine("{0}: {1}", result.StudentName, string.Join(", ", result.Courses)); } } } class Student { public int Id { get; set; } public string Name { get; set; } } class Course { public int Id { get; set; } public string Name { get; set; } } class Enrollment { public int StudentId { get; set; } public int CourseId { get; set; } }