Поделиться через


Стандартные операторы запросов цепочки (C#) (LINQ to XML)

Стандартные операторы запросов можно объединить. Например, можно пересекаться Enumerable.Where с оператором (вызываемым where предложением), и он работает в отложенном режиме. То есть промежуточные результаты не материализуются им.

Пример. Интеръект предложения where

В данном примере метод Where вызывается до вызова метода ConvertCollectionToUpperCase. Метод Where действует практически так же, как отложенные методы, использовавшиеся в предыдущих примерах, приведенных в этом учебнике, ConvertCollectionToUpperCase и AppendString.

Одно из различий заключается в том, 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#).