Enumerable.SelectMany Metode

Definisi

Memproyeksikan setiap elemen urutan ke dan IEnumerable<T> meratakan urutan yang dihasilkan menjadi satu urutan.

Overload

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

Memproyeksikan setiap elemen dari urutan ke IEnumerable<T>, meratakan urutan yang dihasilkan menjadi satu urutan, dan memanggil fungsi pemilih hasil pada setiap elemen di dalamnya.

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

Memproyeksikan setiap elemen dari urutan ke IEnumerable<T>, meratakan urutan yang dihasilkan menjadi satu urutan, dan memanggil fungsi pemilih hasil pada setiap elemen di dalamnya. Indeks setiap elemen sumber digunakan dalam bentuk yang diproyeksikan perantara dari elemen tersebut.

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

Memproyeksikan setiap elemen urutan ke dan IEnumerable<T> meratakan urutan yang dihasilkan menjadi satu urutan.

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

Memproyeksikan setiap elemen dari urutan ke IEnumerable<T>, dan meratakan urutan yang dihasilkan menjadi satu urutan. Indeks setiap elemen sumber digunakan dalam bentuk elemen yang diproyeksikan.

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

Sumber:
SelectMany.cs
Sumber:
SelectMany.cs
Sumber:
SelectMany.cs

Memproyeksikan setiap elemen dari urutan ke IEnumerable<T>, meratakan urutan yang dihasilkan menjadi satu urutan, dan memanggil fungsi pemilih hasil pada setiap elemen di dalamnya.

public:
generic <typename TSource, typename TCollection, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ SelectMany(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, System::Collections::Generic::IEnumerable<TCollection> ^> ^ collectionSelector, Func<TSource, TCollection, TResult> ^ resultSelector);
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);
static member SelectMany : seq<'Source> * Func<'Source, seq<'Collection>> * Func<'Source, 'Collection, 'Result> -> seq<'Result>
<Extension()>
Public Function SelectMany(Of TSource, TCollection, TResult) (source As IEnumerable(Of TSource), collectionSelector As Func(Of TSource, IEnumerable(Of TCollection)), resultSelector As Func(Of TSource, TCollection, TResult)) As IEnumerable(Of TResult)

Jenis parameter

TSource

Jenis elemen source.

TCollection

Jenis elemen perantara yang dikumpulkan oleh collectionSelector.

TResult

Jenis elemen dari urutan yang dihasilkan.

Parameter

source
IEnumerable<TSource>

Urutan nilai yang akan diproyeksikan.

collectionSelector
Func<TSource,IEnumerable<TCollection>>

Fungsi transformasi untuk diterapkan ke setiap elemen urutan input.

resultSelector
Func<TSource,TCollection,TResult>

Fungsi transformasi untuk diterapkan ke setiap elemen urutan perantara.

Mengembalikan

IEnumerable<TResult>

Elemen IEnumerable<T> yang merupakan hasil dari pemanggilan fungsi collectionSelector transformasi satu-ke-banyak pada setiap elemen source dan kemudian memetakan masing-masing elemen urutan tersebut dan elemen sumber yang sesuai ke elemen hasil.

Pengecualian

source atau collectionSelector atau resultSelector adalah null.

Contoh

Contoh kode berikut menunjukkan cara menggunakan SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>) untuk melakukan proyeksi satu-ke-banyak melalui array dan menggunakan fungsi pemilih hasil untuk menyimpan setiap elemen yang sesuai dari urutan sumber dalam cakupan untuk panggilan akhir ke 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}
Structure PetOwner
    Public Name As String
    Public Pets() As String
End Structure

Sub SelectManyEx3()
    ' Create an array of PetOwner objects.
    Dim petOwners() As PetOwner =
{New PetOwner With
 {.Name = "Higa", .Pets = New String() {"Scruffy", "Sam"}},
 New PetOwner With
 {.Name = "Ashkenazi", .Pets = New String() {"Walker", "Sugar"}},
 New PetOwner With
 {.Name = "Price", .Pets = New String() {"Scratches", "Diesel"}},
 New PetOwner With
 {.Name = "Hines", .Pets = New String() {"Dusty"}}}

    ' Project an anonymous type that consists of
    ' the owner's name and the pet's name (string).
    Dim query =
petOwners _
.SelectMany(
    Function(petOwner) petOwner.Pets,
    Function(petOwner, petName) New With {petOwner, petName}) _
.Where(Function(ownerAndPet) ownerAndPet.petName.StartsWith("S")) _
.Select(Function(ownerAndPet) _
       New With {.Owner = ownerAndPet.petOwner.Name,
                 .Pet = ownerAndPet.petName
       })

    Dim output As New System.Text.StringBuilder
    For Each obj In query
        output.AppendLine(String.Format("Owner={0}, Pet={1}", obj.Owner, obj.Pet))
    Next

    ' Display the output.
    Console.WriteLine(output.ToString())
End Sub

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

Keterangan

Metode ini diimplementasikan dengan menggunakan eksekusi yang ditangguhkan. Nilai pengembalian langsung adalah objek yang menyimpan semua informasi yang diperlukan untuk melakukan tindakan. Kueri yang diwakili oleh metode ini tidak dijalankan sampai objek dijumlahkan baik dengan memanggil metodenya GetEnumerator secara langsung atau dengan menggunakan foreach dalam C# atau For Each di Visual Basic.

Metode SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>) ini berguna ketika Anda harus menyimpan elemen source dalam cakupan untuk logika kueri yang terjadi setelah panggilan ke SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>). Lihat bagian Contoh untuk contoh kode. Jika ada hubungan dua arah antara objek jenis TSource dan objek jenis TCollection, yaitu, jika objek jenis TCollection menyediakan properti untuk mengambil TSource objek yang menghasilkannya, Anda tidak memerlukan kelebihan beban SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)ini . Sebagai gantinya, Anda dapat menggunakan SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>) dan menavigasi kembali ke TSource objek melalui TCollection objek .

Dalam sintaks ekspresi kueri, setiap from klausa (C#) atau From klausa (Visual Basic) setelah yang awal diterjemahkan ke pemanggilan SelectMany.

Lihat juga

Berlaku untuk

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

Sumber:
SelectMany.cs
Sumber:
SelectMany.cs
Sumber:
SelectMany.cs

Memproyeksikan setiap elemen dari urutan ke IEnumerable<T>, meratakan urutan yang dihasilkan menjadi satu urutan, dan memanggil fungsi pemilih hasil pada setiap elemen di dalamnya. Indeks setiap elemen sumber digunakan dalam bentuk yang diproyeksikan perantara dari elemen tersebut.

public:
generic <typename TSource, typename TCollection, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ SelectMany(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, int, System::Collections::Generic::IEnumerable<TCollection> ^> ^ collectionSelector, Func<TSource, TCollection, TResult> ^ resultSelector);
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);
static member SelectMany : seq<'Source> * Func<'Source, int, seq<'Collection>> * Func<'Source, 'Collection, 'Result> -> seq<'Result>
<Extension()>
Public Function SelectMany(Of TSource, TCollection, TResult) (source As IEnumerable(Of TSource), collectionSelector As Func(Of TSource, Integer, IEnumerable(Of TCollection)), resultSelector As Func(Of TSource, TCollection, TResult)) As IEnumerable(Of TResult)

Jenis parameter

TSource

Jenis elemen source.

TCollection

Jenis elemen perantara yang dikumpulkan oleh collectionSelector.

TResult

Jenis elemen dari urutan yang dihasilkan.

Parameter

source
IEnumerable<TSource>

Urutan nilai yang akan diproyeksikan.

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

Fungsi transformasi untuk diterapkan ke setiap elemen sumber; parameter kedua fungsi mewakili indeks elemen sumber.

resultSelector
Func<TSource,TCollection,TResult>

Fungsi transformasi untuk diterapkan ke setiap elemen urutan perantara.

Mengembalikan

IEnumerable<TResult>

Elemen IEnumerable<T> yang merupakan hasil dari pemanggilan fungsi collectionSelector transformasi satu-ke-banyak pada setiap elemen source dan kemudian memetakan masing-masing elemen urutan tersebut dan elemen sumber yang sesuai ke elemen hasil.

Pengecualian

source atau collectionSelector atau resultSelector adalah null.

Keterangan

Metode ini diimplementasikan dengan menggunakan eksekusi yang ditangguhkan. Nilai pengembalian langsung adalah objek yang menyimpan semua informasi yang diperlukan untuk melakukan tindakan. Kueri yang diwakili oleh metode ini tidak dijalankan sampai objek dijumlahkan baik dengan memanggil metodenya GetEnumerator secara langsung atau dengan menggunakan foreach dalam C# atau For Each di Visual Basic.

Metode SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>) ini berguna ketika Anda harus menyimpan elemen source dalam cakupan untuk logika kueri yang terjadi setelah panggilan ke SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>). Lihat bagian Contoh untuk contoh kode. Jika ada hubungan dua arah antara objek jenis TSource dan objek jenis TCollection, yaitu, jika objek jenis TCollection menyediakan properti untuk mengambil TSource objek yang menghasilkannya, Anda tidak memerlukan kelebihan beban SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)ini . Sebagai gantinya, Anda dapat menggunakan SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>) dan menavigasi kembali ke TSource objek melalui TCollection objek .

Berlaku untuk

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

Sumber:
SelectMany.cs
Sumber:
SelectMany.cs
Sumber:
SelectMany.cs

Memproyeksikan setiap elemen urutan ke dan IEnumerable<T> meratakan urutan yang dihasilkan menjadi satu urutan.

public:
generic <typename TSource, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ SelectMany(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, System::Collections::Generic::IEnumerable<TResult> ^> ^ selector);
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);
static member SelectMany : seq<'Source> * Func<'Source, seq<'Result>> -> seq<'Result>
<Extension()>
Public Function SelectMany(Of TSource, TResult) (source As IEnumerable(Of TSource), selector As Func(Of TSource, IEnumerable(Of TResult))) As IEnumerable(Of TResult)

Jenis parameter

TSource

Jenis elemen source.

TResult

Jenis elemen urutan yang dikembalikan oleh selector.

Parameter

source
IEnumerable<TSource>

Urutan nilai yang akan diproyeksikan.

selector
Func<TSource,IEnumerable<TResult>>

Fungsi transformasi untuk diterapkan ke setiap elemen.

Mengembalikan

IEnumerable<TResult>

Elemen IEnumerable<T> yang merupakan hasil dari pemanggilan fungsi transformasi satu-ke-banyak pada setiap elemen urutan input.

Pengecualian

source atau selector adalah null.

Contoh

Contoh kode berikut menunjukkan cara menggunakan SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>) untuk melakukan proyeksi satu-ke-banyak melalui array.

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
*/
Structure PetOwner
    Public Name As String
    Public Pets() As String
End Structure

Sub SelectManyEx1()
    ' Create an array of PetOwner objects.
    Dim petOwners() As PetOwner =
{New PetOwner With
 {.Name = "Higa, Sidney", .Pets = New String() {"Scruffy", "Sam"}},
 New PetOwner With
 {.Name = "Ashkenazi, Ronen", .Pets = New String() {"Walker", "Sugar"}},
 New PetOwner With
 {.Name = "Price, Vernette", .Pets = New String() {"Scratches", "Diesel"}}}

    ' Call SelectMany() to gather all pets into a "flat" sequence.
    Dim query1 As IEnumerable(Of String) =
petOwners.SelectMany(Function(petOwner) petOwner.Pets)

    Dim output As New System.Text.StringBuilder("Using SelectMany():" & vbCrLf)
    ' Only one foreach loop is required to iterate through
    ' the results because it is a one-dimensional collection.
    For Each pet As String In query1
        output.AppendLine(pet)
    Next

    ' This code demonstrates how to use Select() instead
    ' of SelectMany() to get the same result.
    Dim query2 As IEnumerable(Of String()) =
petOwners.Select(Function(petOwner) petOwner.Pets)
    output.AppendLine(vbCrLf & "Using Select():")
    ' Notice that two foreach loops are required to iterate through
    ' the results because the query returns a collection of arrays.
    For Each petArray() As String In query2
        For Each pet As String In petArray
            output.AppendLine(pet)
        Next
    Next

    ' Display the output.
    Console.WriteLine(output.ToString())
End Sub

' This code produces the following output:
'
' Using SelectMany():
' Scruffy
' Sam
' Walker
' Sugar
' Scratches
' Diesel
'
' Using Select():
' Scruffy
' Sam
' Walker
' Sugar
' Scratches
' Diesel

Keterangan

Metode ini diimplementasikan dengan menggunakan eksekusi yang ditangguhkan. Nilai pengembalian langsung adalah objek yang menyimpan semua informasi yang diperlukan untuk melakukan tindakan. Kueri yang diwakili oleh metode ini tidak dijalankan sampai objek dijumlahkan baik dengan memanggil metodenya GetEnumerator secara langsung atau dengan menggunakan foreach dalam C# atau For Each di Visual Basic.

Metode menghitung SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>) urutan input, menggunakan fungsi transformasi untuk memetakan setiap elemen ke IEnumerable<T>, dan kemudian menghitung dan menghasilkan elemen dari setiap IEnumerable<T> objek tersebut. Artinya, untuk setiap elemen source, selector dipanggil dan urutan nilai dikembalikan. SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>) kemudian meratakan koleksi dua dimensi ini menjadi satu dimensi IEnumerable<T> dan mengembalikannya. Misalnya, jika kueri menggunakan SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>) untuk mendapatkan pesanan (dari jenis Order) untuk setiap pelanggan dalam database, hasilnya adalah jenis IEnumerable<Order> dalam C# atau IEnumerable(Of Order) di Visual Basic. Jika sebaliknya kueri menggunakan Select untuk mendapatkan pesanan, kumpulan kumpulan pesanan tidak digabungkan dan hasilnya berjenis IEnumerable<List<Order>> C# atau IEnumerable(Of List(Of Order)) di Visual Basic.

Dalam sintaks ekspresi kueri, setiap from klausa (C#) atau From klausa (Visual Basic) setelah yang awal diterjemahkan ke pemanggilan SelectMany.

Lihat juga

Berlaku untuk

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

Sumber:
SelectMany.cs
Sumber:
SelectMany.cs
Sumber:
SelectMany.cs

Memproyeksikan setiap elemen dari urutan ke IEnumerable<T>, dan meratakan urutan yang dihasilkan menjadi satu urutan. Indeks setiap elemen sumber digunakan dalam bentuk elemen yang diproyeksikan.

public:
generic <typename TSource, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ SelectMany(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, int, System::Collections::Generic::IEnumerable<TResult> ^> ^ selector);
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);
static member SelectMany : seq<'Source> * Func<'Source, int, seq<'Result>> -> seq<'Result>
<Extension()>
Public Function SelectMany(Of TSource, TResult) (source As IEnumerable(Of TSource), selector As Func(Of TSource, Integer, IEnumerable(Of TResult))) As IEnumerable(Of TResult)

Jenis parameter

TSource

Jenis elemen source.

TResult

Jenis elemen urutan yang dikembalikan oleh selector.

Parameter

source
IEnumerable<TSource>

Urutan nilai yang akan diproyeksikan.

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

Fungsi transformasi untuk diterapkan ke setiap elemen sumber; parameter kedua fungsi mewakili indeks elemen sumber.

Mengembalikan

IEnumerable<TResult>

Elemen IEnumerable<T> yang merupakan hasil dari pemanggilan fungsi transformasi satu-ke-banyak pada setiap elemen urutan input.

Pengecualian

source atau selector adalah null.

Contoh

Contoh kode berikut menunjukkan cara menggunakan SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>) untuk melakukan proyeksi satu-ke-banyak melalui array dan menggunakan indeks setiap elemen luar.

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
Structure PetOwner
    Public Name As String
    Public Pets() As String
End Structure

Sub SelectManyEx2()
    ' Create an array of PetOwner objects.
    Dim petOwners() As PetOwner =
{New PetOwner With
 {.Name = "Higa, Sidney", .Pets = New String() {"Scruffy", "Sam"}},
 New PetOwner With
 {.Name = "Ashkenazi, Ronen", .Pets = New String() {"Walker", "Sugar"}},
 New PetOwner With
 {.Name = "Price, Vernette", .Pets = New String() {"Scratches", "Diesel"}},
 New PetOwner With
 {.Name = "Hines, Patrick", .Pets = New 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.
    Dim query As IEnumerable(Of String) =
petOwners.SelectMany(Function(petOwner, index) _
                         petOwner.Pets.Select(Function(pet) _
                                                  index.ToString() + pet))

    Dim output As New System.Text.StringBuilder
    For Each pet As String In query
        output.AppendLine(pet)
    Next

    ' Display the output.
    Console.WriteLine(output.ToString())
End Sub

Keterangan

Metode ini diimplementasikan dengan menggunakan eksekusi yang ditangguhkan. Nilai pengembalian langsung adalah objek yang menyimpan semua informasi yang diperlukan untuk melakukan tindakan. Kueri yang diwakili oleh metode ini tidak dijalankan sampai objek dijumlahkan baik dengan memanggil metodenya GetEnumerator secara langsung atau dengan menggunakan foreach dalam C# atau For Each di Visual Basic.

Metode menghitung SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>) urutan input, menggunakan fungsi transformasi untuk memetakan setiap elemen ke IEnumerable<T>, dan kemudian menghitung dan menghasilkan elemen dari setiap IEnumerable<T> objek tersebut. Artinya, untuk setiap elemen source, selector dipanggil dan urutan nilai dikembalikan. SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>) kemudian meratakan koleksi dua dimensi ini menjadi satu dimensi IEnumerable<T> dan mengembalikannya. Misalnya, jika kueri menggunakan SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>) untuk mendapatkan pesanan (dari jenis Order) untuk setiap pelanggan dalam database, hasilnya adalah jenis IEnumerable<Order> dalam C# atau IEnumerable(Of Order) di Visual Basic. Jika sebaliknya kueri menggunakan Select untuk mendapatkan pesanan, kumpulan kumpulan pesanan tidak digabungkan dan hasilnya berjenis IEnumerable<List<Order>> C# atau IEnumerable(Of List(Of Order)) di Visual Basic.

Argumen pertama yang selector mewakili elemen yang akan diproses. Argumen kedua untuk selector mewakili indeks berbasis nol dari elemen tersebut dalam urutan sumber. Ini dapat berguna jika elemen berada dalam urutan yang diketahui dan Anda ingin melakukan sesuatu dengan elemen pada indeks tertentu, misalnya. Ini juga dapat berguna jika Anda ingin mengambil indeks dari satu atau beberapa elemen.

Berlaku untuk