Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Этот пример основан на примере отложенного выполнения и показывает, что происходит, когда вы связываете вместе два запроса, которые оба используют отложенное выполнение и ленивое вычисление.
Пример. Добавление второго метода расширения, который используется 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!!!<
В этом примере видно, что каждый метод расширения работает поочерёдно для каждого элемента в исходной коллекции.
В этом примере должно быть ясно, что даже если мы объединили запросы, которые дают коллекции, промежуточные коллекции не материализуются. Вместо этого каждый элемент передается из одного ленивого метода к следующему. Это приводит к значительно меньшему объему памяти, чем подход, который сначала принимает один массив строк, а затем создает второй массив строк, преобразованных в верхний регистр, и, наконец, создает третий массив строк, где каждая строка имеет восклицательные знаки, добавленные к нему.
Следующая статья в этом руководстве демонстрирует промежуточную материализацию.