Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #71, ОКТЯБРЬ 2006 г.

орки наступают

БОРИС ВОЛЬФСОН

Спецвыпуск: Хакер, номер #071, стр. 071-060-3


[глубокий анализ.]

Теперь разберемся, что же мы все-таки написали. Сначала посмотрим под микроскопом на объявление переменной result и подумаем, настолько ли она бестиповая... Совсем нет – компилятор определяет ее тип по результату запроса. Теперь становится понятным, зачем нужны такие переменные, - ведь если мы изменим тип результата запроса, придется менять и тип переменной result.

Попробуем расписать запрос через методы и лямбда-выражение:

var result = words.Where( (w) => w.Length == 5) ;

Проясняется и роль лямбда-выражений – они фактически используются как условия отбора в запросах.

Поиграемся с select’ом: создадим список чисел и их буквенных эквивалентов и выведем информацию об их четности:

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

string[] strings = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

var digitOddEvens =

from n in numbers

select new {Digit = strings[n], Even = (n % 2 == 0)};

foreach (var d in digitOddEvens)

Console.WriteLine("The digit {0} is {1}.", d.Digit, d.Even ? "even" : "odd");

Тут все становится поинтересней, потому что в операторе выбора создается безымянный объект (и эта возможность языка пригодилась :) ). Объект будет состоять из двух свойств: Digit содержит наименование цифры, а Even – определяет четность/нечетность числа.

[XLinq.]

С контейнерами разобрались. Теперь идем дальше и немного оглядываемся назад. Примемся за следующую часть – за XML – универсальный язык разметки. С помощью него можно хранить любые данные в текстовом формате. Для работы с XML используется часть LINQ, которую обычно называют Xlinq.

Задачу поставим простую: есть база данных в формате XML некоего учебного заведения (пусть будет колледж), и нам надо отобрать претендентов в команду. Главный критерий отбора – это рост: он должен быть более 180 сантиметров, иначе будет сложно играть в баскетбол :).

string xml = "<college>" +

"<student height='195'>John Smith</student>" +

"<student height='195'>Merry Popins</student>" +

"<student height='185'>Bill Gates</student>" +

"<student height='175'>Vasy Pupkin</student>" +

"<student height='170'>Ivan Petrov</student>" +

"</college>";

XElement college = XElement.Parse(xml);

var query =

from student in college.Elements("student")

where (int)student.Attribute("height") > 180

select student;

foreach(var result in query)

Console.WriteLine("Студент {0} имеет рост {1} см",

(string)result,

(string)result.Attribute("height"));

Первым делом мы создали нашу XML-базу данных. Для наглядности я привел ее прямо в коде, хотя, разумеется, она обычно лежит в отдельном файле. Дальше базу надо перевести во внутренний формат, чтобы над ней можно было совершать манипуляции. Такой процесс называют парсингом XML. Затем делаем обычный LINQ-запрос, где в качестве условия указываем значение атрибута height больше 180.

Назад на стр. 071-060-2  Содержание  Вперед на стр. 071-060-4