Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Dikkatli değilseniz, bazı durumlarda sorgularınızdaki koleksiyonların erken somutlaştırılmasına neden olarak uygulamanızın bellek ve performans profilini önemli ölçüde değiştirebilirsiniz. Bazı standart sorgu işleçleri, tek bir öğe vermeden önce girdi koleksiyonlarının somutlaştırılmasına neden olur. Örneğin, Enumerable.OrderBy önce kaynak koleksiyonunun tamamını dolaşır, sonra tüm öğeleri sıralar ve son olarak ilk öğeyi döndürür. 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: ToList öğesini çağırarak 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, kaynak üzerinde yineleme yapılmadan önce ToList'yi çağırır ve bu da kaynakların somutlaştırılmasına 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, ToList çağrısı, AppendString öğesinin ilk öğeyi vermeden önce tüm kaynağı numaralandırmasına neden olur; bunu 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: