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

Метод Enumerable.SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>)

 

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

Проецирует каждый элемент последовательности в IEnumerable<T>, объединяет результирующие последовательности в одну и вызывает функцию селектора результата для каждого элемента этой последовательности.

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

public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(
	this IEnumerable<TSource> source,
	Func<TSource, IEnumerable<TCollection>> collectionSelector,
	Func<TSource, TCollection, TResult> resultSelector
)

Параметры

source
Type: System.Collections.Generic.IEnumerable<TSource>

Последовательность значений, которые следует проецировать.

collectionSelector
Type: System.Func<TSource, IEnumerable<TCollection>>

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

resultSelector
Type: System.Func<TSource, TCollection, TResult>

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

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

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

IEnumerable<T> Элементы которой получены в результате вызова функции преобразования один ко многим collectionSelector для каждого элемента source и последующего сопоставления каждого элемента такой промежуточной последовательности и соответствующего ему исходного элемента с полученным элементом.

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

TSource

Тип элементов source.

TCollection

Тип промежуточных элементов собранные collectionSelector.

TResult

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

Exception Condition
ArgumentNullException

Параметр source, collectionSelector или resultSelector имеет значение null.

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

SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>) Метод полезен, когда требуется сохранить элементы source в области действия для запроса логики, которая выполняется после вызова SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>). Пример кода см. в разделе примеров. Есть ли двухсторонней связи между объектами типа TSource и объекты типа TCollection, то есть, если объект типа TCollection предоставляет свойство для извлечения TSource объект, создавший его, эта перегрузка не обязательно SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>). Вместо этого можно использовать SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) и вернитесь к TSource через TCollection объекта.

Синтаксис выражения запроса каждый from предложение (Visual C#) или From предложение (Visual Basic) после первоначального один преобразуется в вызов метода SelectMany<TSource, TResult>.

В следующем примере кода демонстрируется использование SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>) для выполнения проекции один ко многим к массиву и использовать функцию селектора результата для предотвращения каждого элемента исходной последовательности в области для финального вызова Select.

class PetOwner
{
    public string Name { get; set; }
    public List<string> Pets { get; set; }
}

public static void SelectManyEx3()
{
    PetOwner[] petOwners =
        { new PetOwner { Name="Higa", 
              Pets = new List<string>{ "Scruffy", "Sam" } },
          new PetOwner { Name="Ashkenazi", 
              Pets = new List<string>{ "Walker", "Sugar" } },
          new PetOwner { Name="Price", 
              Pets = new List<string>{ "Scratches", "Diesel" } },
          new PetOwner { Name="Hines", 
              Pets = new List<string>{ "Dusty" } } };

    // Project the pet owner's name and the pet's name.
    var query =
        petOwners
        .SelectMany(petOwner => petOwner.Pets, (petOwner, petName) => new { petOwner, petName })
        .Where(ownerAndPet => ownerAndPet.petName.StartsWith("S"))
        .Select(ownerAndPet =>
                new
                {
                    Owner = ownerAndPet.petOwner.Name,
                    Pet = ownerAndPet.petName
                }
        );

    // Print the results.
    foreach (var obj in query)
    {
        Console.WriteLine(obj);
    }
}

// This code produces the following output:
//
// {Owner=Higa, Pet=Scruffy}
// {Owner=Higa, Pet=Sam}
// {Owner=Ashkenazi, Pet=Sugar}
// {Owner=Price, Pet=Scratches}

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