此示例基于 延迟执行示例中 的示例,并显示将两个查询链接在一起时会发生什么情况,这些查询同时使用延迟执行和延迟计算。
示例:添加用于延迟执行的第二个扩展方法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!!!<
在此示例中,可以看到每个扩展方法逐一对源集合中的每个项目进行操作。
本示例应该清楚的是,即使我们已将生成集合的查询链接在一起,也不会具体化中间集合。 相反,每一项只是从一个迟缓方法传递到下一个迟缓方法。 这会导致内存占用比首先采用一个字符串数组的方法要小得多,然后创建第二个已转换为大写字符串的字符串数组,最后创建第三个字符串数组,其中每个字符串都追加了感叹号。
本教程下一文章演示中间具体化: