Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Подробное рассмотрение оператора select






Оператор select определяет конкретный тип элементов, получаемых по запросу. Ниже приведена его общая форма.

select выражение

В предыдущих примерах оператор select использовался для возврата перемен­ ной диапазона. Поэтому выражение в нем просто обозначало имя переменной диа­ пазона. Но применение оператора select не ограничивается только этой простой функцией. Он может также возвращать отдельную часть значения переменной диа­ пазона, результат выполнения некоторой операции или преобразования переменной диапазона и даже новый тип объекта, конструируемого из отдельных фрагментов ин­ формации, извлекаемой из переменной диапазона. Такое преобразование исходных данных называется проецированием.

Начнем рассмотрение других возможностей оператора select с приведенной ниже программы. В этой программе выводятся квадратные корни положительных значений, содержащихся в массиве типа double.

// Использовать оператор select для возврата квадратных корней всех

// положительных значений, содержащихся в массиве типа double.

using System;

using System.Linq;

 

class SelectDemo {

static void Main() {

double[] nums =

{ -10.0, 16.4, 12.125, 100.85, -2.2, 25.25, -3.5 };

 

// Сформировать запрос на получение квадратных корней всех

// положительных значений, содержащихся в массиве nums.

var sqrRoots = from n in nums

where n > 0

select Math.Sqrt(n);

 

Console.WriteLine(" Квадратные корни положительных значений, \n" +

" округленные до двух десятичных цифр: ");

 

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

foreach (double r in sqrRoots)

Console.WriteLine(" {0: #.##}", r);

}

}

Эта программа дает следующий результат.

Квадратные корни положительных значений,

округленные до двух десятичных цифр:

4.05

3.48

10.04

5.02

Обратите особое внимание в данном примере запроса на следующий оператор select.

select Math.Sqrt(n);

Он возвращает квадратный корень значения переменной диапазона. Для этого зна­ чение переменной диапазона передается методу Math.Sqrt(), который возвращает квадратный корень своего аргумента. Это означает, что последовательность результа­ тов, получаемых при выполнении запроса, будет содержать квадратные корни поло­ жительных значений, хранящихся в массиве nums. Если обобщить этот принцип, то его эффективность станет вполне очевидной. Так, с помощью оператора select мож­ но сформировать любой требующийся тип последовательности результатов, исходя из значений, получаемых из источника данных.

Ниже приведена программа, демонстрирующая другое применение оператора select. В этой программе сначала создается класс EmailAddress, содержащий два свойства. В первом из них хранится имя адресата, а во втором — адрес его электронной почты. Затем в этой программе создается массив, содержащий несколько элементов данных типа EmailAddress. И наконец, в данной программе создается список, состоя­щий только из адресов электронной почты, извлекаемых по запросу.

// Возвратить часть значения переменной диапазона.

using System;

using System.Linq;

 

class EmailAddress {

public string Name { get; set; }

public string Address { get; set; }

 

public EmailAddress(string n, string a) {

Name = n;

Address = a;

}

}

 

class SelectDemo2 {

static void Main() {

EmailAddress[] addrs = {

new EmailAddress(" Герберт", " Herb@HerbSchildt.com"),

new EmailAddress(" Tom", " Tom@HerbSchildt.com"),

new EmailAddress(" Capa", " Sara@HerbSchildt.com")

};

// Сформировать запрос на получение адресов

// электронной почты.

var eAddrs = from entry in addrs

select entry.Address;

 

Console.WriteLine(" Адреса электронной почты: ");

 

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

foreach(string s in eAddrs)

Console.WriteLine(" " + s);

}

}

Вот к какому результату приводит выполнение этой программы.

Адреса электронной почты:

Herb@HerbSchildt.com

Tom@HerbSchildt.com

Sara@HerbSchildt.com

Обратите особое внимание на следующий оператор select.

select entry.Address;

Вместо полного значения переменной диапазона этот оператор возвращает лишь его адресную часть (Address). Это означает, что по данному запросу возвращается последовательность символьных строк, а не объектов типа EmailAddress. Именно поэтому переменная s указывается в цикле foreach как string. Ведь как пояснялось ранее, тип последовательности результатов, возвращаемых по запросу, определяется типом значения, возвращаемым оператором select.

Одной из самых эффективных для оператора select является возможность возвра­ щать последовательность результатов, содержащую элементы данных, формируемые во время выполнения запроса. В качестве примера рассмотрим еще одну программу. В ней определяется класс ContactInfo, в котором хранится имя, адрес электронной почты и номер телефона адресата. Кроме того, в этой программе определяется класс EmailAddress, использовавшийся в предыдущем примере. В методе Main() создает­ ся массив объектов типа ContactInfo, а затем объявляется запрос, в котором источ­ ником данных служит этот массив, но возвращаемая последовательность результатов содержит объекты типа EmailAddress. Таким образом, типом последовательности результатов, возвращаемой оператором select, является класс EmailAddress, а не класс ContactInfo, причем его объекты создаются во время выполнения запроса.

// Использовать запрос для получения последовательности объектов

// типа EmailAddresses из списка объектов типа ContactInfo.

using System;

using System.Linq;

 

class ContactInfo {

public string Name { get; set; }

public string Email { get; set; }

public string Phone { get; set; }

 

public ContactInfo(string n, string a, string p) {

Name = n;

Email = a;

Phone = p;

}

}

 

class EmailAddress {

public string Name { get; set; }

public string Address { get; set; }

 

public EmailAddress(string n, string a) {

Name = n;

Address = a;

}

}

 

class SelectDemo3 {

static void Main() {

ContactInfo[] contacts = {

new Contactlnfo(" Герберт", " Herb@HerbSchildt.com", " 555-1010"),

new Contactlnfo(" Tom", " Tom@HerbSchildt.com", " 555-1101"),

new Contactlnfo(" Capa", " Sara@HerbSchildt.com", " 555-0110")

};

 

// Сформировать запрос на получение списка объектов типа EmailAddress.

var emailList = from entry in contacts

select new EmailAddress(entry.Name, entry.Email);

 

Console.WriteLine(" Список адресов электронной почты: ");

 

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

foreach(EmailAddress е in emailList)

Console.WriteLine(" {0}: {1}", e.Name, e.Address);

}

}

Ниже приведен результат выполнения этой программы.

Список адресов электронной почты:

Герберт: Herb@HerbSchildt.com

Том: Tom@HerbSchildt.com

Сара: Sara@HerbSchildt.com

Обратите особое внимание в данном запросе на следующий оператор select.

select new EmailAddress(entry.Name, entry.Email);

В этом операторе создается новый объект типа EmailAddress, содержащий имя и адрес электронной почты, получаемые из объекта типа ContactInfo, хранящегося в массиве contacts. Но самое главное, что новые объекты типа EmailAddress созда­ ются в операторе select во время выполнения запроса.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.