Enumerable.SelectMany Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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
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
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
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
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.