Ara gerçekleştirme (C#)
Dikkatli değilseniz, bazı durumlarda sorgularınızda koleksiyonların erken gerçekleştirilmesine neden olarak uygulamanızın belleğini ve performans profilini önemli ölçüde değiştirebilirsiniz. Bazı standart sorgu işleçleri, tek bir öğe vermeden önce kaynak koleksiyonlarının gerçekleştirilmesine neden olur. Örneğin, Enumerable.OrderBy önce kaynak koleksiyonunun tamamında yinelenir, sonra tüm öğeleri sıralar ve son olarak ilk öğeyi verir. Bu, sıralı koleksiyonun ilk öğesini almak pahalı olduğu anlamına gelir; bundan sonra her öğe pahalı değildir. Bu mantıklı; bu sorgu işlecinin aksini yapması mümkün olmayabilir.
Örnek: öğesini çağıran ToList
ve gerçekleştirmeye neden olan bir yöntem ekleyin
Bu örnek, Zincir sorguları örneği (C#) içindeki örneği değiştirir: AppendString
yöntemi kaynakta yinelemeden önce çağrılır ToList ve bu da gerçekleştirilmesine neden olur.
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();
}
}
}
Bu örnek aşağıdaki çıkışı oluşturur:
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!!!<
Bu örnekte, çağrısının ilk öğeyi ToList vermeden önce kaynağının tamamını numaralandırmasına neden AppendString
olduğunu görebilirsiniz. Kaynak büyük bir dizi olsaydı, bu uygulamanın bellek profilini önemli ölçüde değiştirirdi.
Standart sorgu işleçleri, bu öğreticinin son makalesinde gösterildiği gibi birbirine zincirlenebilir:
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin