Aracılığıyla paylaş


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 ToListve 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.