Стандартные операторы запросов цепочки (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#).