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

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

Читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен, Эндрю Троелсен . Жанр: Программирование.
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Название: Язык программирования C#9 и платформа .NET5
Дата добавления: 26 август 2023
Количество просмотров: 565
(18+) Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту для удаления материала.
Читать онлайн

Язык программирования C#9 и платформа .NET5 читать книгу онлайн

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

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле.
Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных.
Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

Перейти на страницу:
на следующее обновление метода QueryOverlnts():

static void QueryOverInts()

{

  int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8 };

  // Получить числа меньше 10.

  var subset = from i in numbers where i < 10 select i;

  // Оператор LINQ здесь оценивается!

  foreach (var i in subset)

  {

    Console.WriteLine("{0} < 10", i);

  }

  Console.WriteLine();

  // Изменить некоторые данные в массиве.

  numbers[0] = 4;

  // Снова производится оценка!

  foreach (var j in subset)

  {

    Console.WriteLine("{0} < 10", j);

  }

  Console.WriteLine();

  ReflectOverQueryResults(subset);

}

На заметку! Когда оператор LINQ выбирает одиночный элемент (с использованием First()/FirstOrDefault(), Single()/SingleOrDefault() или любого метода агрегирования), запрос выполняется немедленно. Методы First(), FirstOrDefault(), Single() и SingleOrDefault будут описаны в следующем разделе. Методы агрегирования раскрываются позже в главе.

Ниже показан вывод, полученный в результате запуска программы. Обратите внимание, что во второй итерации по запрошенной последовательности появился дополнительный член, т.к. для первого элемента массива было установлено значение меньше 10:

1 < 10

2 < 10

3 < 10

8 < 10

4 < 10

1 < 10

2 < 10

3 < 10

8 < 10

Среда Visual Studio обладает одной полезной особенностью: если вы поместите точку останова перед оценкой запроса LINQ, то получите возможность просматривать содержимое во время сеанса отладки. Просто наведите курсор мыши на переменную результирующего набора LINQ (subset на рис. 13.1) и вам будет предложено выполнить запрос, развернув узел Results View (Представление результатов).

Роль немедленного выполнения

Когда требуется оценить выражение LINQ, выдающее последовательность, за пределами логики foreach, можно вызывать любое количество расширяющих методов, определенных в типе Enumerable, таких как ТоArray<Т>(), ToDictionary<TSource, ТКеу>() и ToList<T>(). Все методы приводят к выполнению запроса LINQ в момент их вызова для получения снимка данных. Затем полученным снимком данных можно манипулировать независимым образом.

Кроме того, запрос выполняется немедленно в случае поиска только одного элемента. Метод First() возвращает первый элемент последовательности (и должен всегда применяться с конструкцией orderby). Метод FirstOrDefault() возвращает стандартное значение для типа элемента в последовательности, если возвращать нечего, например, когда исходная последовательность пуста или конструкция where отбросила все элементы. Метод Single() также возвращает первый элемент последовательности (на основе orderby или согласно порядку следования элементов, если конструкция orderby отсутствует). Подобно аналогично именованному эквиваленту метод SingleOrDefault() возвращает стандартное значение для типа элемента в последовательности, если последовательность пуста (или конструкция where отбросила все элементы). Отличие между методами First(OrDefault) и Single(OrDefault) заключается в том, что Single(OrDefault) сгенерирует исключение, если из запроса будет возвращено более одного элемента.

static void ImmediateExecution()

{

    Console.WriteLine();

    Console.WriteLine("Immediate Execution");

    int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8 };

    // Получить первый элемент в порядке последовательности

    int number = (from i in numbers select i).First();

    Console.WriteLine("First is {0}", number);

    // Получить первый элемент в порядке запроса

    number = (from i in numbers orderby i select i).First();

    Console.WriteLine("First is {0}", number);

    // Получить один элемент, который соответствует запросу

    number = (from i in numbers where i > 30 select i).Single();

    Console.WriteLine("Single is {0}", number);

    try

    {

        // В случае возвращения более одного элемента генерируется исключение

        number = (from i in numbers where i > 10 select i).Single();

    }

    catch (Exception ex)

    {

        Console.WriteLine("An exception occurred: {0}", ex.Message);

    }

  // Получить данные НЕМЕДЛЕННО как int[].

  int[] subsetAsIntArray =

    (from i in numbers where i < 10 select i).ToArray<int>();

  // Получить данные НЕМЕДЛЕННО как List<int>.

  List<int> subsetAsListOfInts =

    (from i in numbers where i < 10 select i).ToList<int>();

}

Обратите внимание, что для вызова методов Enumerable выражение LINQ целиком помещено в круглые скобки с целью приведения к корректному внутреннему типу (каким бы он ни был).

Вспомните из главы 10, что если компилятор C# в состоянии однозначно определить параметр типа обобщенного элемента, то вы не обязаны указывать этот параметр типа. Следовательно, ТоArray<Т>() (или ToList<T>()) можно было бы вызвать так:

int[] subsetAsIntArray =

  (from i in numbers where i < 10 select i).ToArray();

Полезность немедленного выполнения очевидна, когда нужно возвратить результаты запроса LINQ внешнему вызывающему коду, что и будет темой следующего раздела главы.

Возвращение результатов запроса LINQ

Внутри класса (или структуры) можно определить поле, значением которого будет результат запроса LINQ. Однако для этого нельзя использовать неявную типизацию (т.к. ключевое слово var не может применяться к полям), и целью запроса LINQ не могут быть данные уровня экземпляра, а потому он должен быть статическим. С учетом указанных ограничений необходимость в написании кода следующего вида будет возникать редко:

class LINQBasedFieldsAreClunky

{

  private static string[] currentVideoGames =

    {"Morrowind", "Uncharted 2",

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

  // Здесь нельзя использовать неявную типизацию!

  // Тип subset должен быть известен!

  private IEnumerable<string> subset =

    from g in currentVideoGames

    where g.Contains(" ")

    orderby g

    select g;

  public void PrintGames()

  {

    foreach (var item in subset)

    {

      Console.WriteLine(item);

    }

  }

}

Запросы LINQ часто определяются внутри области действия метода или свойства. Кроме того, для упрощения программирования результирующий набор будет храниться в неявно типизированной локальной переменной, использующей

Перейти на страницу:
Комментарии (0)