net 中的.GroupJoin方法

发布时间 2023-06-21 16:21:23作者: 程序杨%

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