LINQ-запрос к коллекции (списку) данных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

LINQ-запрос к коллекции (списку) данных



В некоторых случаях хранение данных в коллекции (скажем, в списке типа List) может оказаться более эффективным, чем в массиве. Например, если число элементов в массиве при работе изменяется часто или нельзя предсказать макси­мальное количество необходимых элементов, то можно получить большую произ­водительность при использовании коллекции. Но если размер не изменяется или изменяется довольно редко, то массив, пожалуй, более эффективен. Как всегда, производительность в большей степени зависит от конкретного приложения. Как советуют в документации MSDN, часто стоит потратить время на испытание и массива, и коллекции, чтобы выбрать наиболее практичный и эффективный вариант.

Решим три типичных задачи, их условия сформулируем при объяснении рабо-
ты программы. Запустим Visual Studio 2010, закажем новый проект шаблона Win-
dows Forms Application С#
. Затем из панели элементов перенесем в форму тексто-
вое поле. Далее через щелчок правой кнопкой мыши перейдем к вкладке
программного кода (листинг 19.2).

Листинг 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; просмотров: 304; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.11.34 (0.01 с.)