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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 252 253 254 255 256 257 258 259 260 ... 642

Item: System Shock 2

Item: Uncharted 2

Решение с использованием расширяющих методов

Применяемый ранее (и далее в главе) синтаксис LINQ называется выражениями запросов LINQ, которые представляют собой формат, похожий на SQL, но слегка отличающийся от него. Существует еще один синтаксис с расширяющими методами, который будет использоваться в большинстве примеров в настоящей книге. Создайте новый метод по имени QueryOverStringsWithExtensionMethods() со следующим кодом:

static void QueryOverStringsWithExtensionMethods()

{

  // Пусть имеется массив строк.

  string[] currentVideoGames = {"Morrowind", "Uncharted 2",

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

                                "Fallout 3", "Daxter", "System Shock 2"};

  // Построить выражение запроса для поиска

  // в массиве элементов, содержащих пробелы.

<b>  IEnumerable&lt;string&gt; subset =</b>

<b>    currentVideoGames.Where(g =&gt; g.Contains(&quot; &quot;))</b>

<b>                           .OrderBy(g =&gt; g).Select(g =&gt; g);</b>

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

  foreach (string s in subset)

  {

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

  }

}

Код здесь тот же, что и в предыдущем методе, кроме строк, выделенных полужирным. В них демонстрируется применение синтаксиса расширяющих методов, в котором для определения операций внутри каждого метода используются лямбда-выражения. Например, лямбда-выражение в методе Where() определяет условие (содержит ли значение пробел). Как и в синтаксисе выражений запросов, используемая для идентификации значения буква произвольна; в примере применяется v для видеоигр (video game).

Хотя результаты аналогичны (метод дает такой же вывод, как и предыдущий метод, использующий выражение запроса), вскоре вы увидите, что тип результирующего набора несколько отличается. В большинстве (если фактически не во всех) сценариях подобное отличие не приводит к каким-либо проблемам и форматы могут применяться взаимозаменяемо.

Решение без использования LINQ

Конечно, применение LINQ никогда не бывает обязательным. При желании идентичный результирующий набор можно получить без участия LINQ с помощью таких программных конструкций, как операторы if и циклы for. Ниже приведен метод, который выдает тот же самый результат, что и QueryOverStrings(), но в намного более многословной манере:

static void QueryOverStringsLongHand()

{

  // Предположим, что имеется массив строк.

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

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

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

  string[] gamesWithSpaces = new string[5];

  for (int i = 0; i &lt; currentVideoGames.Length; i++)

  {

    if (currentVideoGames[i].Contains(&quot; &quot;))

    {

      gamesWithSpaces[i] = currentVideoGames[i];

    }

  }

  // Отсортировать набор.

  Array.Sort(gamesWithSpaces);

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

  foreach (string s in gamesWithSpaces)

  {

    if( s != null)

    {

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

    }

  }

  Console.WriteLine();

}

Несмотря на возможные пути улучшения метода QueryOverStringsLongHand(), факт остается фактом — запросы LINQ способны радикально упростить процесс извлечения новых подмножеств данных из источника. Вместо построения вложенных циклов, сложной логики if/else, временных типов данных и т.п. компилятор С# сделает всю черновую работу, как только вы создадите подходящий запрос LINQ.

Выполнение рефлексии результирующего набора LINQ

А теперь определите в классе Program дополнительный вспомогательный метод по имени ReflectOverQueryResults(), который выводит на консоль разнообразные детали о результирующем наборе LINQ (обратите внимание на параметр типа System.Object, позволяющий учитывать множество типов результирующих наборов):

static void ReflectOverQueryResults(object resultSet,

                                    string queryType = &quot;Query Expressions&quot;)

{

  Console.WriteLine($&quot;***** Info about your query using {queryType} *****&quot;);

  // Вывести тип результирующего набора

  Console.WriteLine(&quot;resultSet is of type: {0}&quot;, resultSet.GetType().Name);

  // Вывести местоположение результирующего набора

  Console.WriteLine(&quot;resultSet location: {0}&quot;,

                     resultSet.GetType().Assembly.GetName().Name);

}

1 ... 252 253 254 255 256 257 258 259 260 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий