Прочитать на английском

Поделиться через


Enumerable.SelectMany Метод

Определение

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

Перегрузки

SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)

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

SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)

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

SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>)

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

SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>)

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

SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)

Исходный код:
SelectMany.cs
Исходный код:
SelectMany.cs
Исходный код:
SelectMany.cs

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

C#
public static System.Collections.Generic.IEnumerable<TResult> SelectMany<TSource,TCollection,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,System.Collections.Generic.IEnumerable<TCollection>> collectionSelector, Func<TSource,TCollection,TResult> resultSelector);

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

TSource

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

TCollection

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

TResult

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

Параметры

source
IEnumerable<TSource>

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

collectionSelector
Func<TSource,IEnumerable<TCollection>>

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

resultSelector
Func<TSource,TCollection,TResult>

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

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

IEnumerable<TResult>

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

Исключения

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

Примеры

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

C#
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}

Комментарии

Этот метод реализуется с помощью отложенного выполнения. Немедленное возвращаемое значение — это объект, в котором хранятся все сведения, необходимые для выполнения действия. Запрос, представленный этим методом, не выполняется, пока объект не будет перечислен либо путем вызова его GetEnumerator метода напрямую, либо с помощью foreach в 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 предложение (C#) или From предложение (Visual Basic) после начального преобразуется в вызов SelectMany.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)

Исходный код:
SelectMany.cs
Исходный код:
SelectMany.cs
Исходный код:
SelectMany.cs

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

C#
public static System.Collections.Generic.IEnumerable<TResult> SelectMany<TSource,TCollection,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,int,System.Collections.Generic.IEnumerable<TCollection>> collectionSelector, Func<TSource,TCollection,TResult> resultSelector);

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

TSource

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

TCollection

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

TResult

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

Параметры

source
IEnumerable<TSource>

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

collectionSelector
Func<TSource,Int32,IEnumerable<TCollection>>

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

resultSelector
Func<TSource,TCollection,TResult>

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

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

IEnumerable<TResult>

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

Исключения

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

Комментарии

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

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

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>)

Исходный код:
SelectMany.cs
Исходный код:
SelectMany.cs
Исходный код:
SelectMany.cs

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

C#
public static System.Collections.Generic.IEnumerable<TResult> SelectMany<TSource,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,System.Collections.Generic.IEnumerable<TResult>> selector);

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

TSource

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

TResult

Тип элементов последовательности, возвращаемых функцией selector.

Параметры

source
IEnumerable<TSource>

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

selector
Func<TSource,IEnumerable<TResult>>

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

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

IEnumerable<TResult>

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

Исключения

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

Примеры

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

C#
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
*/

Комментарии

Этот метод реализуется с помощью отложенного выполнения. Немедленное возвращаемое значение — это объект, в котором хранятся все сведения, необходимые для выполнения действия. Запрос, представленный этим методом, не выполняется, пока объект не будет перечислен либо путем вызова его GetEnumerator метода напрямую, либо с помощью foreach в 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 для получения заказов, коллекция коллекций заказов не объединяется и результат имеет тип IEnumerable<List<Order>> в C# или IEnumerable(Of List(Of Order)) в Visual Basic.

В синтаксисе выражения запроса каждое from предложение (C#) или From предложение (Visual Basic) после начального преобразуется в вызов SelectMany.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>)

Исходный код:
SelectMany.cs
Исходный код:
SelectMany.cs
Исходный код:
SelectMany.cs

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

C#
public static System.Collections.Generic.IEnumerable<TResult> SelectMany<TSource,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,int,System.Collections.Generic.IEnumerable<TResult>> selector);

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

TSource

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

TResult

Тип элементов последовательности, возвращаемых функцией selector.

Параметры

source
IEnumerable<TSource>

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

selector
Func<TSource,Int32,IEnumerable<TResult>>

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

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

IEnumerable<TResult>

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

Исключения

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

Примеры

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

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

public static void SelectManyEx2()
{
    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" } },
          new PetOwner { Name="Hines, Patrick",
              Pets = new List<string>{ "Dusty" } } };

    // Project the items in the array by appending the index
    // of each PetOwner to each pet's name in that petOwner's
    // array of pets.
    IEnumerable<string> query =
        petOwners.SelectMany((petOwner, index) =>
                                 petOwner.Pets.Select(pet => index + pet));

    foreach (string pet in query)
    {
        Console.WriteLine(pet);
    }
}

// This code produces the following output:
//
// 0Scruffy
// 0Sam
// 1Walker
// 1Sugar
// 2Scratches
// 2Diesel
// 3Dusty

Комментарии

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

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

Первый аргумент представляет selector обрабатываемый элемент. Второй аргумент для selector представляет отсчитываемый от нуля индекс этого элемента в исходной последовательности. Это может быть полезно, если элементы находятся в известном порядке и вы хотите сделать что-то с элементом по определенному индексу, например. Это также может быть полезно, если требуется получить индекс одного или нескольких элементов.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0