Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Метод Enumerable.Join<TOuter, TInner, TKey, TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter, TKey>, Func<TInner, TKey>, Func<TOuter, TInner, TResult>)

 

Опубликовано: Октябрь 2016

Устанавливает корреляцию между элементами двух последовательностей на основе сопоставления ключей. Для сравнения ключей используется компаратор проверки на равенство по умолчанию.

Пространство имен:   System.Linq
Сборка:  System.Core (в System.Core.dll)

public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(
	this IEnumerable<TOuter> outer,
	IEnumerable<TInner> inner,
	Func<TOuter, TKey> outerKeySelector,
	Func<TInner, TKey> innerKeySelector,
	Func<TOuter, TInner, TResult> resultSelector
)

Параметры

outer
Type: System.Collections.Generic.IEnumerable<TOuter>

Первая последовательность для соединения.

inner
Type: System.Collections.Generic.IEnumerable<TInner>

Последовательность, соединяемая с первой последовательностью.

outerKeySelector
Type: System.Func<TOuter, TKey>

Функция, извлекающая ключ соединения из каждого элемента первой последовательности.

innerKeySelector
Type: System.Func<TInner, TKey>

Функция, извлекающая ключ соединения из каждого элемента второй последовательности.

resultSelector
Type: System.Func<TOuter, TInner, TResult>

Функция для создания результирующего элемента для пары соответствующих элементов.

Возвращаемое значение

Type: System.Collections.Generic.IEnumerable<TResult>

IEnumerable<T> Содержит элементы типа TResult полученные в результате внутреннего соединения двух последовательностей.

Параметры типа

TOuter

Тип элементов первой последовательности.

TInner

Тип элементов второй последовательности.

TKey

Тип ключей, возвращаемых функциями селектора ключа.

TResult

Тип результирующих элементов.

Exception Condition
ArgumentNullException

outer или inner или outerKeySelector или innerKeySelector или resultSelectornull.

Этот метод реализуется с использованием отложенного выполнения. Немедленно возвращаемое значение — это объект, который хранит все сведения, необходимые для выполнения действия. Запрос, представленный данным методом не выполняется до перечисления объекта путем непосредственного вызова его GetEnumerator метода или с помощью foreach в Visual C# или For Each в Visual Basic.

Компаратор проверки на равенство по умолчанию, Default, используемый для хэширования и сравнения ключей.

Соединение — это операция связывания элементов из двух источников информации на основе общих ключа. Join<TOuter, TInner, TKey, TResult> объединяет два источника информации и ключей, с помощью которых они сопоставляются друг с другом в один вызов метода. Это отличается от использования SelectMany, которого требуется выполнить ту же операцию более одного вызова метода.

Join<TOuter, TInner, TKey, TResult> сохраняет порядок элементов outer, и для каждого из этих элементов, порядок сопоставления элементов inner.

В синтаксисе выражений запросов join (Visual C#) или Join (Visual Basic) преобразует предложение для вызова Join<TOuter, TInner, TKey, TResult>.

В терминах реляционных баз данных Join<TOuter, TInner, TKey, TResult> метод реализует внутреннее уравнивающее соединение. «Внутренние» означает, что только элементы, имеющие соответствия в другой последовательности включаются в результаты. "Уравнивающее соединение" является соединением, в котором ключи проверяются на равенство. Левое внешнее соединение операция имеет не выделенный стандартного оператора запроса, но может быть выполнена с помощью GroupJoin<TOuter, TInner, TKey, TResult> метод. См. раздел Join Operations.

В следующем примере кода демонстрируется использование Join<TOuter, TInner, TKey, TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter, TKey>, Func<TInner, TKey>, Func<TOuter, TInner, TResult>) для выполнения внутреннего соединения двух последовательностей на основе общих ключа.

class Person
{
    public string Name { get; set; }
}

class Pet
{
    public string Name { get; set; }
    public Person Owner { get; set; }
}

public static void JoinEx1()
{
    Person magnus = new Person { Name = "Hedlund, Magnus" };
    Person terry = new Person { Name = "Adams, Terry" };
    Person charlotte = new Person { Name = "Weiss, Charlotte" };

    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 daisy = new Pet { Name = "Daisy", Owner = magnus };

    List<Person> people = new List<Person> { magnus, terry, charlotte };
    List<Pet> pets = new List<Pet> { barley, boots, whiskers, daisy };

    // Create a list of Person-Pet pairs where 
    // each element is an anonymous type that contains a
    // Pet's name and the name of the Person that owns the Pet.
    var query =
        people.Join(pets,
                    person => person,
                    pet => pet.Owner,
                    (person, pet) =>
                        new { OwnerName = person.Name, Pet = pet.Name });

    foreach (var obj in query)
    {
        Console.WriteLine(
            "{0} - {1}",
            obj.OwnerName,
            obj.Pet);
    }
}

/*
 This code produces the following output:

 Hedlund, Magnus - Daisy
 Adams, Terry - Barley
 Adams, Terry - Boots
 Weiss, Charlotte - Whiskers
*/

Универсальная платформа Windows
Доступно с 8
.NET Framework
Доступно с 3.5
Переносимая библиотека классов
Поддерживается в: переносимые платформы .NET
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1
Вернуться в начало
Показ: