Megosztás a következőn keresztül:


Köztes anyagosítás (C#)

Ha nem vigyáz, bizonyos helyzetekben drasztikusan megváltoztathatja az alkalmazás memória- és teljesítményprofilját azáltal, hogy a lekérdezésekben idő előtt materializálja a gyűjteményeket. Egyes standard lekérdezési operátorok a forrásgyűjteményük materializálását okozzák, mielőtt egyetlen elemet adnak hozzá. Először például Enumerable.OrderBy végigvezeti a teljes forrásgyűjteményen, majd rendezi az összes elemet, majd végül az első elemet adja meg. Ez azt jelenti, hogy költséges a megrendelt gyűjtemény első elemének lekérése; az egyes elemek ezután nem drágák. Ennek van értelme; a lekérdezési operátor számára lehetetlen lenne másként tenni.

Példa: Adjon hozzá egy metódust, amely meghívja a materializációt ToListokozó metódust

Ez a példa módosítja a Lánc lekérdezések példában (C#) szereplő példát: a AppendString metódus a forráson való iterálás előtt hívásra ToList módosul, ami materializálást okoz.

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();
        }
    }
}

Ez a példa a következő kimenetet hozza létre:

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!!!<

Ebben a példában láthatja, hogy a hívás ToList a teljes forrás számbavételét okozza AppendString az első elem létrehozása előtt. Ha a forrás nagy tömb lenne, az jelentősen megváltoztatná az alkalmazás memóriaprofilját.

A standard lekérdezési operátorok is összefűzhetők az oktatóanyag utolsó cikkében látható módon:

Lásd még