Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
<< На главную

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Читать онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 265 266 267 268 269 270 271 272 273 ... 642
Перейти на страницу:

  {

    Console.WriteLine(&quot;Item: {0}&quot;, game);

  }

  Console.WriteLine();

}

Как видите, построение выражения запроса LINQ с применением методов класса Enumerable напрямую приводит к намного более многословному запросу, чем в случае использования операций запросов С#. Кроме того, поскольку методы Enumerable требуют передачи делегатов в качестве параметров, обычно необходимо писать лямбда-выражения, чтобы обеспечить обработку входных данных внутренней целью делегата.

Построение выражений запросов с использованием типа Enumerable и анонимных методов

Учитывая, что лямбда-выражения C# — это просто сокращенный способ работы с анонимными методами, рассмотрим третье выражение запроса внутри вспомогательного метода QueryStringsWithAnonymousMethods():

static void  QueryStringsWithAnonymousMethods()

{

  Console.WriteLine(&quot;***** Using Anonymous Methods *****&quot;);

  string[] currentVideoGames = {&quot;Morrowind&quot;, &quot;Uncharted 2&quot;,

                                &quot;Fallout 3&quot;, &quot;Daxter&quot;, &quot;System Shock 2&quot;};

  // Построить необходимые делегаты Func&lt;&gt;

  // с использованием анонимных методов.

  Func&lt;string, bool&gt; searchFilter =

      delegate(string game) { return game.Contains(&quot; &quot;); };

  Func&lt;string, string&gt; itemToProcess = delegate(string s) { return s; };

  // Передать делегаты в методы класса Enumerable.

  var subset =

      currentVideoGames.Where(searchFilter).OrderBy(itemToProcess).

      Select(itemToProcess);

  // Вывести результаты.

  foreach (var game in subset)

  {

    Console.WriteLine(&quot;Item: {0}&quot;, game);

  }

  Console.WriteLine();

}

Такой вариант выражения запроса оказывается еще более многословным из-за создания вручную делегатов Func&lt;&gt;, применяемых методами Where(), OrderBy() и Select() класса Enumerable. Положительная сторона данного подхода связана с тем, что синтаксис анонимных методов позволяет заключить всю обработку, выполняемую делегатами, в единственное определение метода. Тем не менее, этот метод функционально эквивалентен методам QueryStringsWithEnumerableAndLambdas() и QueryStringsWithOperators(), созданным в предшествующих разделах.

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

Построение выражений запросов с использованием типа Enumerable и низкоуровневых делегатов

Наконец, если вы хотите строить выражение запроса с применением многословного подхода, то можете отказаться от использования синтаксиса лямбда-выражений и анонимных методов и напрямую создавать цели делегатов для каждого типа Func&lt;&gt;. Ниже показана финальная версия выражения запроса, смоделированная внутри нового типа класса по имени VeryComplexQueryExpression:

class VeryComplexQueryExpression

{

  public static void QueryStringsWithRawDelegates()

  {

    Console.WriteLine(&quot;***** Using Raw Delegates *****&quot;);

    string[] currentVideoGames = {&quot;Morrowind&quot;, &quot;Uncharted 2&quot;,

                                  &quot;Fallout 3&quot;, &quot;Daxter&quot;, &quot;System Shock 2&quot;};

    // Построить необходимые делегаты Func&lt;&gt;.

    Func&lt;string, bool&gt; searchFilter =

      new Func&lt;string, bool&gt;(Filter);

    Func&lt;string, string&gt; itemToProcess =

      new Func&lt;string,string&gt;(ProcessItem);

    // Передать делегаты в методы класса Enumerable.

    var subset =

      currentVideoGames

       .Where(searchFilter)

       .OrderBy(itemToProcess)

       .Select(itemToProcess);

    // Вывести результаты.

    foreach (var game in subset)

    {

      Console.WriteLine(&quot;Item: {0}&quot;, game);

    }

    Console.WriteLine();

  }

  // Цели делегатов.

  public static bool Filter(string game)

  {

    return game.Contains(&quot; &quot;);

  }

  public static string ProcessItem(string game)

  {

    return game;

  }

}

Чтобы протестировать такую версию логики обработки строк, метод QueryStringsWithRawDelegates() понадобится вызвать внутри операторов верхнего уровня в классе Program:

1 ... 265 266 267 268 269 270 271 272 273 ... 642
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга