Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Jika Anda tidak berhati-hati, Anda dapat, dalam beberapa situasi, secara signifikan mengubah profil memori dan kinerja aplikasi Anda dengan menyebabkan materialisasi koleksi yang prematur dalam kueri Anda. Beberapa operator kueri standar menyebabkan koleksi sumber mereka dimaterialisasi sebelum memberikan satu elemen. Misalnya, Enumerable.OrderBy pertama-tama berulang melalui seluruh koleksi sumbernya, lalu mengurutkan semua item, lalu akhirnya menghasilkan item pertama. Ini berarti bahwa mahal untuk mendapatkan item pertama dari koleksi yang dipesan; setiap item setelahnya tidak mahal. Ini masuk akal; tidak mungkin bagi operator kueri tersebut untuk melakukan sebaliknya.
Contoh: Tambahkan metode yang memanggil ToList, menyebabkan materialisasi
Contoh ini mengubah contoh dalam contoh kueri berantai (C#): metode AppendString diubah untuk memanggil ToList sebelum melakukan iterasi melalui sumber, yang menyebabkan eksekusi nyata terjadi.
public static class LocalExtensions
{
public static IEnumerable<string>
ConvertCollectionToUpperCase(this IEnumerable<string> source)
{
foreach (string str in source)
{
Console.WriteLine("ToUpper: source >{0}<", str);
yield return str.ToUpper();
}
}
public static IEnumerable<string>
AppendString(this IEnumerable<string> source, string stringToAppend)
{
// the following statement materializes the source collection in a List<T>
// before iterating through it
foreach (string str in source.ToList())
{
Console.WriteLine("AppendString: source >{0}<", str);
yield return str + stringToAppend;
}
}
}
class Program
{
static void Main(string[] args)
{
string[] stringArray = { "abc", "def", "ghi" };
IEnumerable<string> q1 =
from s in stringArray.ConvertCollectionToUpperCase()
select s;
IEnumerable<string> q2 =
from s in q1.AppendString("!!!")
select s;
foreach (string str in q2)
{
Console.WriteLine("Main: str >{0}<", str);
Console.WriteLine();
}
}
}
Contoh ini menghasilkan output berikut:
ToUpper: source >abc<
ToUpper: source >def<
ToUpper: source >ghi<
AppendString: source >ABC<
Main: str >ABC!!!<
AppendString: source >DEF<
Main: str >DEF!!!<
AppendString: source >GHI<
Main: str >GHI!!!<
Dalam contoh ini, Anda dapat melihat bahwa panggilan ke ToList menyebabkan AppendString mengiterasi seluruh sumbernya sebelum menghasilkan elemen pertama. Jika sumbernya adalah array besar, ini akan secara signifikan mengubah profil memori aplikasi.
Operator kueri standar juga dapat ditautkan bersama seperti yang ditunjukkan dalam artikel akhir dalam tutorial ini: