орки наступают БОРИС ВОЛЬФСОН Спецвыпуск: Хакер, номер #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. |