Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Этот пример основан на примере отложенного выполнения и показывает, что происходит, когда вы связываете вместе два запроса, которые оба используют отложенное выполнение и ленивое вычисление.
Пример. Добавление второго метода расширения, который используется yield return для отложения выполнения
В этом примере представлен другой метод расширения, AppendStringкоторый добавляет указанную строку к каждой строке в исходной коллекции, а затем возвращает измененную строку.
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)
{
foreach (string str in source)
{
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();
}
}
}
В примере получается следующий вывод.
ToUpper: source >abc<
AppendString: source >ABC<
Main: str >ABC!!!<
ToUpper: source >def<
AppendString: source >DEF<
Main: str >DEF!!!<
ToUpper: source >ghi<
AppendString: source >GHI<
Main: str >GHI!!!<
В этом примере видно, что каждый метод расширения работает поочерёдно для каждого элемента в исходной коллекции.
В этом примере должно быть ясно, что даже если мы объединили запросы, которые дают коллекции, промежуточные коллекции не материализуются. Вместо этого каждый элемент передается из одного ленивого метода к следующему. Это приводит к значительно меньшему объему памяти, чем подход, который сначала принимает один массив строк, а затем создает второй массив строк, преобразованных в верхний регистр, и, наконец, создает третий массив строк, где каждая строка имеет восклицательные знаки, добавленные к нему.
Следующая статья в этом руководстве демонстрирует промежуточную материализацию.