链查询示例 (C#) (LINQ to XML)

此示例基于 延迟执行示例中 的示例,并显示将两个查询链接在一起时会发生什么情况,这些查询同时使用延迟执行和延迟计算。

示例:添加用于延迟执行的第二个扩展方法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!!!<

在此示例中,可以看到每个扩展方法逐一对源集合中的每个项目进行操作。

本示例应该清楚的是,即使我们已将生成集合的查询链接在一起,也不会具体化中间集合。 相反,每一项只是从一个迟缓方法传递到下一个迟缓方法。 这会导致内存占用比首先采用一个字符串数组的方法要小得多,然后创建第二个已转换为大写字符串的字符串数组,最后创建第三个字符串数组,其中每个字符串都追加了感叹号。

本教程下一文章演示中间具体化:

另请参阅