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



ЗНАЕТЕ ЛИ ВЫ?

LINQ-запрос к массиву данных

Поиск

LINQ-запрос представляет собой выражение, извлекающее данные из источни­ка данных. Все операции запроса LINQ состоят из трех различных действий: полу­чение источника (в нашем случае — это присвоение Начальных значений исходно­му массиву) данных, создание запроса (начинается с предложения from) и непосредственное выполнение запроса (обычно это цикл foreach). В данном раз­деле рассмотрим две задачи, первая — из массива имен извлекаем имена длиной шесть символов, записывая их или в список (коллекцию), или в новый массив. Дру­гая -задача— из массива целых чисел выбираем только те, значения которых больше четырех, также записывая результат запроса в список или массив.

Итак, запустим Visual Studio 2010, закажем новый проект шаблона Windows Forms Application С#. Затем из панели элементов перенесем в форму текстовое поле. Далее через щелчок правой кнопкой мыши перейдем к вкладке программного кода (листинг 19.1).

Листинг 19.1. Извлечение данных из массивов

// Решаем две задачи по выбору элементов из массива с помощью стандартных

// запросов технологии LINQ

using System;

using System.Linq;

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace Linq1

{

public partial class Form1: Form

{

public Form1()

{

InitializeComponent();

this.Text = "Технология LINQ"; textBox1.Multiline = true;

// ЗАДАЧА 1:

// Из массива имен выбрать имена с количеством букв равным шести,

// вывести эти имена в текстовое поле TextBox в алфавитном порядке, при

// этом все буквы перевести в верхний регистр.

// Решение:

string СтрокаИмен = "Витя Лариса Лариса Лена Андрей Женя " +

"Александр Лариса Виктор Света Оксана Наташа";

// Из строки имен получаем массив имен, задавая в качестве сепаратора

// деления подстрок символ пробела:

string[] Имена = СтрокаИмен.Split(' ');

// или проще: string[] Имена =

// { "Витя", "Лариса", "Лариса", "Лена", "Андрей", "Женя",

// "Александр", "Лариса", "Виктор", "Света", "Оксана", "Наташа" };

textBox1.Text = "ЗАДАЧА 1. В списке имен:\r\n\r\n";

foreach (string x in Имена)

textBox1.Text = textBox1.Text + x + " ";

// В результате LINQ-запроса получаем список имен с количеством букв

// равным шести:

var Запрос = from s in Имена

where s.Length == 6 // - условие выбора

orderby s // - сортировать в алфавитном порядке

select s.ToUpper(); // - перевод в верхний регистр

// s - это переменная диапазона схожа с переменной итерации в foreach

// Удаляем элементы-дубликаты из списка имен:

Запрос = Запрос.Distinct();

// Или таким образом:

// Запрос = Запрос.Union(Запрос);

textBox1.Text = textBox1.Text + "\r\n\r\n" +

"выбираем имена с количеством букв равным шести, при " +

"этом избавляемся от дублирования имен:\r\n\r\n";

foreach (string x in Запрос) // x - переменная итерации в цикле foreach

textBox1.Text = textBox1.Text + x + " ";

textBox1.Text = textBox1.Text + "\r\n\r\n";

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// ЗАДАЧА 2: Из массива целых чисел X[] требуется выбрать числа,

// значения которых >= 4, и записать эти числа в список Y,

// отсортировав выбранные числа по возрастанию.

// Решение:

// Инициализация массива целых чисел:

int[] X = { -2, 5, -23, 0, 7, -10, 11, 11, 14, 3, 8, 5, -5, 27, 8 };

textBox1.Text += "ЗАДАЧА 2. Из заданного массива X:\r\n\r\n";

foreach (int x in X)

textBox1.Text = textBox1.Text + x + " ";

textBox1.Text = textBox1.Text + "\r\n\r\nвыбираем числа, значения " +

"которых >= 4 и записываем их в список (коллекцию) Y, " +

"исключая элементы-дубликаты:\r\n\r\n";

// Y - это список, куда помещается выбранные элементы:

var Y = from x in X

where x >= 4 // - условие выбора

orderby x // - сортируем по возрастанию

select x;

// Таким образом можно получить результат запроса в массив:

// int[] Y = (from x in X // Здесь Y - это уже массив;

// where x >= 4 // - условие выбора;

// orderby x // - сортируем по возрастанию;

// select x).ToArray(); // - преобразование списка в массив

// Удаляем элементы-дубликаты из списка целых чисел:

var Z = Y.Distinct();

// Или таким образом:

// var Z = Y.Union(Y);

// Вывод элементов списка Y в метку textBox1:

foreach (var z in Z)

textBox1.Text = textBox1.Text + z.ToString() + " ";

}

}

}

Как видно из программного кода, после присвоения массиву Имена начальных значений создаем запрос, который предусматривает выбор (select) из (from) мас­сива Имена строк длиной (Length) ровно шесть символов (условие where). Запись выбранных имен выполняется в список Запрос с сортировкой списка в алфавитном порядке имен. Далее для удаления повторяющихся имен в списке используем функцию Distinct. В комментарии показано, как можно для этой же цели исполь­зовать функцию union, которая, вообще говоря, находит объединение двух мно­жеств, т. е. выбирает в двух списках одинаковые элементы с удалением повторяю­щихся элементов. Поскольку мы объединяем два одинаковых списка, то получаем просто удаление повторяющихся элементов. Цикл foreach выводит список Запрос в текстовое поле textBox1.

Следующая задача, решенная в данном программном коде, аналогична. Задан массив целых чисел X. Из этого массива выбираем в список Y элементы массива, значения которых больше или равны четырем. В комментарии показано, как можно записать результаты LINQ-запроса в массив. Удаление повторяющихся элементов в списке выполнено также с использованием функции Distinct.

На рис. 19.1 приведен фрагмент работы программы.

 

Рисунок 19.1 - LINQ-запросы к массивам данных

Убедиться в работоспособности программы можно, открыв решение Linq1.sln папки Linq1.



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 395; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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