C#

Листинг №13. Агрегатные операции

double[] temperature = { 2.0, -21.3, 8, -4, 0, 8.2 };

Console. WriteLine("Max temp: {0}", (from t in temperature select t).Max());

Console. WriteLine("Min temp: {0}", (from t in temperature select t).Min());

Console. WriteLine("Average temp: {0}", (from t in temperature select t).Average());

Console. WriteLine("Sum of all temps: {0}", (from t in temperature select t).Sum());

Рис. 10. Результат выполнения программы №13

Точечный синтаксис

Вторым вариантом LINQ запросов является точечный синтаксис, реализованный через расширяющие методы и лямбда-выражения.

Например, вывести имена, которые начинаются с А, создав новые объекты на лету (с полями name и len), с сортировкой по длине (поле len):

static void Main(string[] args)

{

List<String> names = new List<String>{ "Anna", "Vasja","Kolja","Lizs","Ksenia","Annabell","Agela","Tolik","Tom"};

var arr = names. Where( x => x. StartsWith("A") ).Select( x => (new {name=x, len=x. Length} ) ).OrderBy(y => y. len);

foreach( var a in arr)

Console. WriteLine("Res - name {0}, len {1}", a. name, a. len);

Console. ReadKey();

}

Работа с различными объектами XML

Помимо возможности создания LINQ-запросов в. NET 4 предлагаются различные объ­екты XML, которые работают настолько хорошо, что могут иметь свое собственное место за пределами LINQ. Эти объекты могут применяться вместо непосредственной работы с DOM. Они называются вспомогательными объектами LINQ to XML, размещаются в про­странстве имен System. Xml. Linq и способны значительно упростить взаимодействие с XML-документом в памяти.

НЕ нашли? Не то? Что вы ищете?

В следующих разделах кратко показано, как использовать доступные в этом простран­стве имен объекты.

Объект XDocument

Объект XDocument является заменой объекта XmlDocument, который применялся в. NET 3.5, с ним гораздо легче работать, чем с XML-документами. Он используется совме­стно с другими новыми объектами в этой же области, такими как XNamespace, XComment, XElement и XAttribute.

Одним из наиболее важных членов объекта XDocument является метод Load ():

XDocument. Load(@"С:\Hamlet. xml");

Эта операция приведет к загрузке содержимого файла Hamlet, xml в память в виде объекта XDocument. Методу Load() можно также передавать объект TextReader или Xml Reader. После этого с XML можно работать из кода:

XDocument xdoc = XDocument. Load(@"С:\Hamlet. xml");

Console. WriteLine(xdoc. Root. Name. ToString());

Console. WriteLine(xdoc. Root. HasAttributes. ToString());

Другим важным членом XDocument является метод Save (), который подобно методу Load () позволяет сохранять XML-данные на физическом диске либо в объекте TextWriter или XmlWriter:

XDocument xdoc = XDocument. Load(@"С:\Hamlet. xml");

xdoc. Save(@"С:\CopyOfHamlet. xml");

Объект XElement

С объектом XElement придется работать чаще всего. С его помощью легко создавать отдельные объекты элементов, представляющие собой как целые документы XML, так и их отдельные фрагменты. Ниже показан пример создания XML-элемента с соответствующим значением:

XElement хе = new XElement("Company", "Lipper");

Console. WnteLme (xe. ToString ());

Объект XAttribute

Другим важным фактором XML, помимо элементов, являются атрибуты. Добавлять и работать с атрибутами позволяет объект XAttribute. Ниже показан пример добавления атрибута в корневой узел <Company>:

XElement xe = new XElement("Company",

new XAttribute ("MyAttribute", "MyAttnbuteValue"),

new XElement ("CompanyName", "Lipper"),

new XElement ("CompanyAddress",

new XElement ("Address", "123 Main Street"),

new XElement ("City", "St. Louis"),

new XElement ("State", "MO"),

new XElement ("Country", "USA")));

Создание XML на основе запроса к БД

var arr = db. roads;

XDocument doc=new XDocument(new XElement("root"));

foreach (var i in arr)

{

doc. Root. Add(new XElement("road",

new XAttribute("src",i. src),

new XAttribute("dest",i. dest),

new XElement("cost",i. cost) ) );

foreach (var b in i. builders)

{

doc. Root. Elements().Last().Add(new XElement("builder",

new XAttribute("name", b. title),

new XAttribute("beg", b. year_beg),

new XAttribute("eend", b. year_end),

new XElement("per", b. period)));

}

}

doc. Save("c:\\abc. xml");

Использование LINQ для выдачи запросов к документам XML

Теперь, когда известно, как помещать XML-документы в объект XDocument и работать с различными их частями, можно посмотреть на применение LINQ to XML для выдачи запросов к XML-документам и обработки результатов.

Как будет показано ниже, для запроса статического XML-документа с помощью LINQ to XML не понадобится прилагать почти никаких усилий. Ниже приведен пример выдачи запроса к файлу hamlet.xml для получения списка всех персонажей (актеров), которые принимают участие в пьесе. Каждый из этих персонажей представлен в XML-документе элементом <PERSONA>.

XDocument xdoc = XDocument. Load(@"C:\hamlet. xml");

var query = from people in xdoc. Descendants("PERSONA")

select people. Value;

Console. WnteLine("Найдено {0} персонажей", query. Count());

Console. WnteLine();

foreach (var item in query)

{

Console. WnteLine (item);

}

Console. ReadLme ();

В наши дни динамические XML-документы встречаются в Интернете очень часто. Они формируются в каналах блогов, подкастов и т. п. за счет отправки запроса по конкретно­му конечному ULR-адресу. Эти каналы могут просматриваться как в браузере посредством специального RSS-arpeгатора, так и в виде чистого XML. Ниже показан пример работы с RSS-каналом непосредственно из кода.

XDocument xdoc = XDocument. Load(@"http:///evjen/Rss. aspx");

Работа с документом XML

При проработке примеров с XML-документом hamlet.xml можно было заметить, что он является довольно большим. Пока что в этой главе было показано лишь несколько спо­собов, которыми можно запрашивать данные из XML-документов, а в следующем разделе демонстрируется методика чтения и записи данных в XML-документ.

Чтение данных из документа XML

Ранее уже было показано, насколько легко отправлять запросы в XML-документ с при­менением операторов запросов LINQ вроде следующего:

var query = from people in xdoc. Descendants("PERSONA")

select people. Value;

Этот запрос возвращает всех персонажей, найденных в документе. С использованием метода Element () объекта XDocument из XML-документа можно извлечь конкретные зна­чения, с которым будет производиться работа. Например, следующий фрагмент XML пока­зывает, каким образом в документе hamlet.xml представлен элемент <TITLE>:

<?xml version="1.0"?>

<PLAY>

<TITLE>The Tragedy of Hamlet, Prince of Denmark</TITLE>

<!—XML удален для ясности—>

</PLAY>

Нетрудно заметить, что элемент </TITLE> вложен в элемент <PLAY>. Следовательно, к нему легко добраться с помощью следующего фрагмента кода в консольном приложении:

XDocument xdoc = XDocument. Load(@"С:\hamlet. xml");

Console. WriteLine(xdoc. Element("PLAY").Element("TITLE").Value);

Запись данных в документ XML

Запись данных в документ XML осуществляется так же легко, как и чтение. Например, чтобы изменить имя первого персонажа в файле hamlet. xml, можно воспользоваться сле­дующим кодом:

XDocument xdoc = XDocument. Load(@"C:\hamlet. xml");

xdoc. Element("PLAY").Element("PERSONAE").Element("PERSONA").SetValue("Bill Evjen, king of Denmark");

Console. WriteLine(xdoc. Element("PLAY").Element("PERSONAE").Element("PERSONA").Value);

В данном случае первый экземпляр элемента <PERSONA> перезаписывается значением Bill Evjen, king of Denmark с помощью метода SetValue() объекта Element(). После вызова метода SetValue() и применения значения к XML-документу это значение затем извлекается с использованием того же подхода, что раньше. После выполнения этого фрагмента кода можно увидеть, что значение первого элемента <PERSONA> изменилось.

Другим способом изменения документа (в рассматриваемом примере — для добавления в него элементов) является создание нужных элементов в виде объектов XElement и затем их добавление в документ.

XDocument xdoc = XDocument. Load(@"C:\hamlet. xml");

XElement xe = new XElement("PERSONA","Bill Evjen, king of Denmark");

xdoc. Element("PLAY").Element("PERSONAE").Add(xe);

var query = from people in xdoc. Descendants("PERSONA")

select people. Value;

Console. WriteLine("Найдено {0} персонажей", query. Count());

Console. WriteLine();

foreach (var item in query)

{

Console. WriteLine(item);

}

Практическое выполнение

Работа с коллекциями - LINQ to object

В среде MS Visual Studio создать консольное приложение на языке С#. Определить и инициализировать коллекцию (список строк). Используя технологию linq to objects выполнить набор запросов (через точечный синтаксис и запросом).

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4

Основные порталы (построено редакторами)

Домашний очаг

ДомДачаСадоводствоДетиАктивность ребенкаИгрыКрасотаЖенщины(Беременность)СемьяХобби
Здоровье: • АнатомияБолезниВредные привычкиДиагностикаНародная медицинаПервая помощьПитаниеФармацевтика
История: СССРИстория РоссииРоссийская Империя
Окружающий мир: Животный мирДомашние животныеНасекомыеРастенияПриродаКатаклизмыКосмосКлиматСтихийные бедствия

Справочная информация

ДокументыЗаконыИзвещенияУтверждения документовДоговораЗапросы предложенийТехнические заданияПланы развитияДокументоведениеАналитикаМероприятияКонкурсыИтогиАдминистрации городовПриказыКонтрактыВыполнение работПротоколы рассмотрения заявокАукционыПроектыПротоколыБюджетные организации
МуниципалитетыРайоныОбразованияПрограммы
Отчеты: • по упоминаниямДокументная базаЦенные бумаги
Положения: • Финансовые документы
Постановления: • Рубрикатор по темамФинансыгорода Российской Федерациирегионыпо точным датам
Регламенты
Термины: • Научная терминологияФинансоваяЭкономическая
Время: • Даты2015 год2016 год
Документы в финансовой сферев инвестиционнойФинансовые документы - программы

Техника

АвиацияАвтоВычислительная техникаОборудование(Электрооборудование)РадиоТехнологии(Аудио-видео)(Компьютеры)

Общество

БезопасностьГражданские права и свободыИскусство(Музыка)Культура(Этика)Мировые именаПолитика(Геополитика)(Идеологические конфликты)ВластьЗаговоры и переворотыГражданская позицияМиграцияРелигии и верования(Конфессии)ХристианствоМифологияРазвлеченияМасс МедиаСпорт (Боевые искусства)ТранспортТуризм
Войны и конфликты: АрмияВоенная техникаЗвания и награды

Образование и наука

Наука: Контрольные работыНаучно-технический прогрессПедагогикаРабочие программыФакультетыМетодические рекомендацииШколаПрофессиональное образованиеМотивация учащихся
Предметы: БиологияГеографияГеологияИсторияЛитератураЛитературные жанрыЛитературные героиМатематикаМедицинаМузыкаПравоЖилищное правоЗемельное правоУголовное правоКодексыПсихология (Логика) • Русский языкСоциологияФизикаФилологияФилософияХимияЮриспруденция

Мир

Регионы: АзияАмерикаАфрикаЕвропаПрибалтикаЕвропейская политикаОкеанияГорода мира
Россия: • МоскваКавказ
Регионы РоссииПрограммы регионовЭкономика

Бизнес и финансы

Бизнес: • БанкиБогатство и благосостояниеКоррупция(Преступность)МаркетингМенеджментИнвестицииЦенные бумаги: • УправлениеОткрытые акционерные обществаПроектыДокументыЦенные бумаги - контрольЦенные бумаги - оценкиОблигацииДолгиВалютаНедвижимость(Аренда)ПрофессииРаботаТорговляУслугиФинансыСтрахованиеБюджетФинансовые услугиКредитыКомпанииГосударственные предприятияЭкономикаМакроэкономикаМикроэкономикаНалогиАудит
Промышленность: • МеталлургияНефтьСельское хозяйствоЭнергетика
СтроительствоАрхитектураИнтерьерПолы и перекрытияПроцесс строительстваСтроительные материалыТеплоизоляцияЭкстерьерОрганизация и управление производством