Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
LINQ-запрос к коллекции (списку) данных
В некоторых случаях хранение данных в коллекции (скажем, в списке типа List) может оказаться более эффективным, чем в массиве. Например, если число элементов в массиве при работе изменяется часто или нельзя предсказать максимальное количество необходимых элементов, то можно получить большую производительность при использовании коллекции. Но если размер не изменяется или изменяется довольно редко, то массив, пожалуй, более эффективен. Как всегда, производительность в большей степени зависит от конкретного приложения. Как советуют в документации MSDN, часто стоит потратить время на испытание и массива, и коллекции, чтобы выбрать наиболее практичный и эффективный вариант. Решим три типичных задачи, их условия сформулируем при объяснении рабо- Листинг 19.2. Извлечение данных из списков // Решаем три различных задачи по выбору элементов (объектов) из списка с помощью // стандартных запросов технологии LINQ using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются в данной программе namespace Linq2 { public partial class Form1: Form { public Form1() { InitializeComponent(); this.Text = "Технология LINQ"; textBox1.Multiline = true; // ЗАДАЧА 1. Из списка строк выбрать нужные записи задав условие выбора textBox1.Text = "ЗАДАЧА 1: Из списка имен:\r\n"; // Объявление списка строк и его заполнение: var Список = new List<string> { "Витя", "Света", "Андрей", "Лариса", "Маша", "Наташа" }; // или var Список = new List<string>(); // - список строк // Список.Add("Витя"); Список.Add("Света"); Список.Add("Андрей"); // Список.Add("Лариса"); Список.Add("Маша"); Список.Add("Наташа"); // Некоторые манипуляции со списком: int n = Список.Count; // Кол-во элементов в списке: // Получение из списка его элемента с индесом 3 (как в массиве): string A = Список.ElementAt<string>(4); Boolean Ответ = Список.Remove("Лариса"); // - удаление из списка // Преобразовать список в строковый массив: string[] МассивСтрок = Список.ToArray(); foreach (var x in Список) textBox1.Text = textBox1.Text + x.ToString() + " ";
textBox1.Text += "\r\nвыбираем имена длиной четыре символа:\r\n"; // СписокВыбранныхИмен - это новый список, куда попадают выбранные // строки в результате LINQ-запроса: var СписокВыбранныхИмен = from Имя in Список where Имя.Length == 4 // - условие выбора orderby Имя // - сортировать список Z select Имя; // Вывод списка выбранных имен в текстовое поле textBox1: foreach (var x in СписокВыбранныхИмен) textBox1.Text = textBox1.Text + x.ToString() + " "; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ЗАДАЧА 2. textBox1.Text += "\r\n\r\nЗАДАЧА 2: Из списка сотрудников предприятия " + "выбираем не курящих для повышения зарплаты:\r\n\r\n"; // Заполняем список сотрудников: List<Сотрудник> Сотрудники = new List<Сотрудник>{ new Сотрудник {Имя="Карапузова Ирина", Возраст=27, КуритЛи=true }, new Сотрудник {Имя="Зиборов Виктор", Возраст=47, КуритЛи=false }, new Сотрудник {Имя="Ломачинская Светлана", Возраст=34, КуритЛи=false }, new Сотрудник {Имя="Стороженко Светлана", Возраст=34, КуритЛи=false }, new Сотрудник {Имя="Еременко Татьяна", Возраст=34, КуритЛи=true }, new Сотрудник {Имя="Погребицкий Олег", Возраст=42, КуритЛи=true }, }; var СписокНекурящихСотрудников = from Сотрудник in Сотрудники where Сотрудник.КуритЛи == false orderby Сотрудник.Имя select Сотрудник; // Вывод списка некурящих сотрудников в текстовое поле textBox1: foreach (var x in СписокНекурящихСотрудников) textBox1.Text = textBox1.Text + string.Format("{0} - возраст " + "- {1}\r\n", x.Имя, x.Возраст); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ЗАДАЧА 3. textBox1.Text += "\r\nЗАДАЧА 3: Из списка студентов факультета " + "выбираем двоечников:\r\n\r\n"; // Каждый элемент в списке содержит фамилию студента и полученные // им текущие оценки: List<Студент> Студенты = new List<Студент> { new Студент {Фамилия="Зиборов", Оценки= new List<int> {5, 4, 4, 5}}, new Студент {Фамилия="Стороженко", Оценки= new List<int> {3, 3, 2, 3}}, new Студент {Фамилия="Ломачинская", Оценки= new List<int> {3, 4, 4, 5}}, new Студент {Фамилия="Погребицкий", Оценки= new List<int> {2, 4, 3, 2}}, new Студент {Фамилия="Левочкин", Оценки= new List<int> {3, 3, 4, 3}} }; // Для доступа к внутреннему списку оценок предложение From // используем два раза: var СписокДвоечников = from Студент in Студенты
from Оценка in Студент.Оценки where Оценка <= 2 orderby Студент.Фамилия select new { Студент.Фамилия, Оценка }; foreach (var Студик in СписокДвоечников) textBox1.Text += string.Format("Студент {0} " + "имеет оценку: {1}\r\n", Студик.Фамилия, Студик.Оценка); // Строка со студентом Погребицким выводится два раза, поскольку он // имеет две двойки } } // Объявляем класс, содержащий имя сотрудника, его возраст, а также // информацию, курит ли он: public class Сотрудник { public string Имя { get; set; } public int Возраст { get; set; } public bool КуритЛи { get; set; } } // Объявляем класс, содержащий фамилию студента и список полученных им оценок: public class Студент { public string Фамилия { get; set; } public List<int> Оценки { get; set; } } }
Первая задача довольно простая и очень похожа на задачи, которые мы решали с помощью технологии LINQ в предыдущем примере. Здесь, в этой новой задаче вместо массива имен требуется создать список имен, а далее из этого списка выбрать имена длиной четыре символа. Решение этой задачи, построение LINQ- запроса аналогично решению задачи из предыдущего примера, отличие состоит лишь в применении синтаксиса манипуляций со списком типа List, а не с массивом. Здесь также приведены некоторые важные техники для манипуляции списком, в частности получение элемента списка по указанному индексу (аналогия с массивом), удаление элемента, преобразование списка в строковый массив. Вторая задача заключается в том, чтобы создать список сотрудников предприятия и из этого списка выбрать некоторых сотрудников по какому-либо признаку, например тех, кто не курит. При создании списка объявлен класс Сотрудник, который содержит три свойства: Имя, Возраст и булеву переменную КуритЛи. В начале решения заполняем список сотрудников, а затем строим LINQ-запрос для заполнения списка некурящих сотрудников. Этот список выводим в текстовое поле textBox1, используя цикл foreach. Третья задача немного сложнее. Требуется создать список студентов факультета, содержащий фамилию студента и список полученных им текущих оценок, т. е. список оценок должен быть "вложен" в список студентов. Из списка студентов необходимо выбрать тех, кто имеет в списке своих оценок хотя бы одну двойку. Для решения этой задачи вначале объявляем новый класс Студент, который имеет в качестве свойств класса фамилию студента и список (типа List) оценок. Далее в начале решения третьей задачи мы привели синтаксис заполнения списка студентов. Затем строим LINQ-запрос, где, поскольку нам необходимо искать элемент списка внутри "вложенного" списка, мы используем предложение From два раза. Поскольку студент Погребицкий имеет две двойки в списке своих текущих оценок, он в списке двоечников фигурирует дважды (рис. 19.2). Рисунок 19.2 - Три LINQ-запроса к спискам данных Убедиться в работоспособности программы можно, открыв решение Linq2.sln папки Linq2.
|
||||||
Последнее изменение этой страницы: 2016-04-26; просмотров: 305; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.70.203 (0.011 с.) |