将标准查询运算符链接在一起 (C#)(LINQ to XML)

标准查询运算符也可以链接在一起。 例如,可以交错调用 Enumerable.Where 运算符(通过 where 子句调用),它以延迟方式运行;也就是说,中间结果不会通过它进行实例化。

示例:将 where 子句交错

在此示例中,调用 Where 之前将调用 ConvertCollectionToUpperCase 方法。 Where 方法的操作方式与本教程前面示例中使用的迟缓方法 ConvertCollectionToUpperCaseAppendString 几乎完全相同。

区别之一是在本例中,Where 方法循环访问其源集合,确定第一项不传递谓词,然后获取传递谓词的下一项。 示例然后生成第二项。

但基本要旨是相同的:除非必要,否则不具体化中间集合。

在使用查询表达式时,会将查询表达式转换为对标准查询运算符的调用,这一原理同样适用。

本节中查询 Office Open XML 文档的所有示例都使用相同的原理。 延迟执行和迟缓计算是有效使用 LINQ(和 LINQ to XML)所必须理解的一些基础概念。

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()
            where s.CompareTo("D") >= 0
            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<
ToUpper: source >def<
AppendString: source >DEF<
Main: str >DEF!!!<

ToUpper: source >ghi<
AppendString: source >GHI<
Main: str >GHI!!!<

这是教程:将查询链接在一起 (C#) 教程中的最后一篇文章。