Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ-Лабораторная 4.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
182.96 Кб
Скачать

Пример соединения с использованием простого ключа

В следующем примере создаются две коллекции, содержащие объекты двух определяемых пользователем типов Person и Pet. В C# при запросе используется предложение join для сопоставления объектов Person с объектами Pet, для которых Owner является Person.Предложение select в языке C# определяет то, как будут выглядеть результирующие объекты.В этом примере результирующие объекты — анонимные типы, состоящие из имени владельца и клички питомца.

C#

Копировать

class Person

{

publicstringFirstName { get; set; }

publicstringLastName { get; set; }

}

class Pet

{

publicstring Name { get; set; }

public Person Owner { get; set; }

}

///<summary>

/// Simple inner join.

///</summary>

publicstaticvoidInnerJoinExample()

{

Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };

Person terry = new Person { FirstName = "Terry", LastName = "Adams" };

Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };

Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };

Person rui = new Person { FirstName = "Rui", LastName = "Raposo" };

Pet barley = new Pet { Name = "Barley", Owner = terry };

Pet boots = new Pet { Name = "Boots", Owner = terry };

Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };

Pet bluemoon = new Pet { Name = "Blue Moon", Owner = rui };

Pet daisy = new Pet { Name = "Daisy", Owner = magnus };

// Create two lists.

List<Person> people = new List<Person>{ magnus, terry, charlotte, arlene, rui };

List<Pet> pets = new List<Pet>{ barley, boots, whiskers, bluemoon, daisy };

// Create a collection of person-pet pairs. Each element in the collection

// is an anonymous type containing both the person's name and their pet's name.

var query = from person in people

join pet in pets on person equalspet.Owner

selectnew { OwnerName = person.FirstName, PetName = pet.Name };

foreach (varownerAndPetin query)

{

Console.WriteLine("\"{0}\" is owned by {1}", ownerAndPet.PetName, ownerAndPet.OwnerName);

}

}

// This code produces the following output:

//

// "Daisy" is owned by Magnus

// "Barley" is owned by Terry

// "Boots" is owned by Terry

// "Whiskers" is owned by Charlotte

// "Blue Moon" is owned by Rui

Обратите внимание, что объект Person,свойство которого LastName имеет значение "Huff", не отображается среди результатов, так как не существует объекта Pet, свойство Pet.Owner которого было бы равно свойству Person.

Пример соединения с использованием составного ключа

Вместо сопоставления элементов на основании всего лишь одного свойства можно использовать составной ключ для сопоставления элементов на основании нескольких свойств. Для этого укажите, чтобы функция выбора ключа каждой коллекции возвращала анонимный тип, состоящий из свойств, которые необходимо сравнить.Если задается метка свойства, необходимо указать одну и ту же метку во всех анонимных типах ключа.Свойства также должны располагаться в том же порядке.

В следующем примере списки объектов Employee и Student используются для определения того, какие работники являются также студентами. Оба этих типа обладают свойствами FirstName и LastName типа String.Функция, создающая ключи соединения из элементов каждого списка, возвращает анонимный тип, состоящий из свойств FirstName и LastName каждого элемента.Операция соединения сравнивает данные составные ключи на признак равенства и возвращает пары объектов из обоих списков, у которых совпадают имя и фамилия.

C#

Копировать

class Employee

{

publicstringFirstName { get; set; }

publicstringLastName { get; set; }

publicintEmployeeID { get; set; }

}

class Student

{

publicstringFirstName { get; set; }

publicstringLastName { get; set; }

publicintStudentID { get; set; }

}

///<summary>

///Performs a join operation using a composite key.

///</summary>

publicstaticvoidCompositeKeyJoinExample()

{

// Create a list of employees.

List<Employee> employees = new List<Employee> {

new Employee { FirstName = "Terry", LastName = "Adams", EmployeeID = 522459 },

new Employee { FirstName = "Charlotte", LastName = "Weiss", EmployeeID = 204467 },

new Employee { FirstName = "Magnus", LastName = "Hedland", EmployeeID = 866200 },

new Employee { FirstName = "Vernette", LastName = "Price", EmployeeID = 437139 } };

// Create a list of students.

List<Student> students = new List<Student> {

new Student { FirstName = "Vernette", LastName = "Price", StudentID = 9562 },

new Student { FirstName = "Terry", LastName = "Earls", StudentID = 9870 },

new Student { FirstName = "Terry", LastName = "Adams", StudentID = 9913 } };

// Join the two data sources based on a composite key consisting of first and last name,

// to determine which employees are also students.

IEnumerable<string> query = from employee in employees

join student in students

onnew { employee.FirstName, employee.LastName }

equalsnew { student.FirstName, student.LastName }

selectemployee.FirstName + " " + employee.LastName;

Console.WriteLine("The following people are both employees and students:");

foreach (string name in query)

Console.WriteLine(name);

}

// This code produces the following output:

//

// The following people are both employees and students:

// TerryAdams

// VernettePrice