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

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

 

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

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

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

public static IEnumerable<TResult> SelectMany<TSource, TResult>(
	this IEnumerable<TSource> source,
	Func<TSource, IEnumerable<TResult>> selector
)

Параметры

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

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

selector
Type: System.Func<TSource, IEnumerable<TResult>>

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

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

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

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

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

TSource

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

TResult

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

Exception Condition
ArgumentNullException

Параметр source или selector имеет значение null.

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

SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) Метод перечисляет входной последовательности, использует функцию преобразования для сопоставления каждого элемента IEnumerable<T>, а затем перечисляет и выдает элементы каждого такого IEnumerable<T> объекта. То есть для каждого элемента source, selector вызывается и возвращается последовательность значений. SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) затем выравнивает эта коллекция двумерных коллекции в одномерный IEnumerable<T> и возвращает его. Например, если запрос использует SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) для получения заказов (типа Order) для каждого клиента в базе данных, результат имеет тип IEnumerable<Order> в C# или IEnumerable(Of Order) в Visual Basic. Если вместо этого запрос использует Select<TSource, TResult> для получения заказов, коллекцию коллекций заказов не объединяются и результат имеет тип IEnumerable<List<Order>> в C# или IEnumerable(Of List(Of Order)) в Visual Basic.

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

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

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

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

    // Query using SelectMany().
    IEnumerable<string> query1 = petOwners.SelectMany(petOwner => petOwner.Pets);

    Console.WriteLine("Using SelectMany():");

    // Only one foreach loop is required to iterate 
    // through the results since it is a
    // one-dimensional collection.
    foreach (string pet in query1)
    {
        Console.WriteLine(pet);
    }

    // This code shows how to use Select() 
    // instead of SelectMany().
    IEnumerable<List<String>> query2 =
        petOwners.Select(petOwner => petOwner.Pets);

    Console.WriteLine("\nUsing Select():");

    // Notice that two foreach loops are required to 
    // iterate through the results
    // because the query returns a collection of arrays.
    foreach (List<String> petList in query2)
    {
        foreach (string pet in petList)
        {
            Console.WriteLine(pet);
        }
        Console.WriteLine();
    }
}

/*
 This code produces the following output:

 Using SelectMany():
 Scruffy
 Sam
 Walker
 Sugar
 Scratches
 Diesel

 Using Select():
 Scruffy
 Sam

 Walker
 Sugar

 Scratches
 Diesel
*/

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