Объединение стандартных операторов запросов в цепочку
Это последний раздел учебника Объединение запросов в цепочки.
Стандартные операторы запросов также можно объединять в цепочки. Например, можно вставить оператор Enumerable.Where, который также будет действовать как отложенный. Этот оператор не материализует промежуточные результаты.
Пример
В данном примере метод Where вызывается до вызова метода ConvertCollectionToUpperCase. Метод Where действует практически так же, как отложенные методы, использовавшиеся в предыдущих примерах, приведенных в этом учебнике, ConvertCollectionToUpperCase и AppendString.
Отличие заключается в том, что в этом случае метод Where просматривает свою исходную коллекцию, определяет, что первый элемент не передает предикат, а затем переходит к следующему элементу, который предикат передает. После этого метод выдает второй элемент.
Однако базовый принцип остался прежним: промежуточные коллекции материализуются только в случае необходимости.
При использовании выражений запросов они преобразуются в вызовы стандартных операторов запросов, а затем применяется тот же принцип.
Во всех примерах, приведенных в этом разделе, в которых запрашиваются документы Office Open XML, используется один и тот же принцип. Отложенное выполнение и отложенное вычисление — это основополагающие принципы, которые необходимо понимать, чтобы эффективно использовать LINQ (и LINQ to XML).
Примечание
В следующем примере используется конструкция yield return языка C#.Так как в Visual Basic 2008 эквивалентной функции нет, этот пример приведен только на C#.
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!!!<