<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7550093075906678978</id><updated>2024-10-28T09:39:55.951+03:00</updated><category term=".net"/><category term="asp.net"/><category term="tools"/><category term="visual studio"/><category term="system.web.routing"/><category term="debug"/><category term="silverlight"/><category term="firefox"/><category term="ie"/><category term="javascript"/><category term="t4"/><category term="trick"/><category term="advanced"/><category term="algorithms"/><category term="aop"/><category term="apple"/><category term="beginner"/><category term="cryptography"/><category term="flash"/><category term="haskell"/><category term="md5"/><category term="objective-c"/><category term="prolog"/><category term="readit"/><category term="smalltalk"/><category term="tdd"/><category term="validation"/><category term="wtf"/><title type='text'>Заметки на полях</title><subtitle type='html'>Мой дядя самых честных правил программ исходники за так ...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andir-notes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default?max-results=5&amp;redirect=false'/><link rel='alternate' type='text/html' href='http://andir-notes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default?start-index=6&amp;max-results=5&amp;redirect=false'/><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>5</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7550093075906678978.post-4733853149963176736</id><published>2011-09-13T13:49:00.001+04:00</published><updated>2011-09-13T16:31:22.972+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="beginner"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><category scheme="http://www.blogger.com/atom/ns#" term="smalltalk"/><title type='text'>Мини-гайд по началам изучения Objective C</title><content type='html'>&lt;p&gt;Опять же, собрано для себя.&lt;/p&gt;  &lt;h4&gt;Введение&lt;/h4&gt;  &lt;p&gt;Язык Objective C, на первый взгляд, очень простой, чтобы начать программировать – достаточно базового знания Cи и слышать что-нибудь про &lt;a href=&quot;http://ru.wikipedia.org/wiki/SmallTalk&quot;&gt;SmallTalk&lt;/a&gt;, где вызов метода – это посылка сообщения.&lt;/p&gt;  &lt;p&gt;Для людей с бэкграундом любого обьектно-ориентированного языка все концепции очень быстро понимаются и изучаются методом практического программирования.&lt;/p&gt;  &lt;h4&gt;Инструменты&lt;/h4&gt;  &lt;p&gt;Как это не странно, но каких-либо удобных инструментов под платформу Windows для этого языка &lt;strike&gt;не существует&lt;/strike&gt; не найдено мной, к сожалению.&lt;/p&gt;  &lt;p&gt;Поэтому как обычно, пришлось брать стандартный GCC (с поддержкой Objective C) и MakeFile в руки. Для редактирования текстов и исполнения программ, я уже который год подряд использую прекрасный, хоть уже слегка и устаревший редактор Scite.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgStC8dGdCWi2BGstPoyudiExsguy0sqJ7nzMtZLN13cd4vgC0NfBKWFvfJ4reSoQmzDuQ5Iq6MeYCBQ5xyycSt6C_retKX1wVUWIM_A7OJqlmASWdtKTedWMeGtWnaBJlugWfMfMfLGo4/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;Скриншот: Редактор Scite и программа на Objective C&quot; border=&quot;0&quot; alt=&quot;Скриншот: Редактор Scite и программа на Objective C&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9Ds9YWm9MkGJSeBk8P8VJ7waVpckQUSNPW7v_3e94q_1X2YSP3NBJcQlPyEoF59YRqylfVIyS21G5JgJ-rRw3vmbG3HQ26BGwXx9m_D9znsc__aHFlI-_AIRyBXUnLZjsjNFz0C2Wdm0/?imgmax=800&quot; width=&quot;882&quot; height=&quot;772&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Примечание: Официальную версию Scite можно взять &lt;/em&gt;&lt;a href=&quot;http://www.scintilla.org/SciTE.html&quot;&gt;&lt;em&gt;тут&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Однако, самой подходящей версией Scite, сейчас, видимо является – &lt;/em&gt;&lt;a href=&quot;http://code.google.com/p/scite-ru/&quot;&gt;&lt;em&gt;русская сборка&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, которая содержит ряд полезных дополнений к оригинальной версии и поддерживает скриптовый язык Lua.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;И далее, компилировать GCC с поддержкой Objective-C:&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;2&quot; face=&quot;Consolas&quot;&gt;gcc.exe -x objective-c -lobjc -I$(OBJC_INC) -L$(OBJC_LIB) *.m $(OBJC_BASELIBS) -o Main.exe&lt;/font&gt;&lt;/p&gt;  &lt;h4&gt;Синтаксис&lt;/h4&gt;  &lt;p&gt;Ух, это просто сказка.&lt;/p&gt;  &lt;p&gt;По сути, вы можете взять любую Си-программу и откомпилировать её компилятором Objective C. Полная обратная совместимость.&lt;/p&gt;  &lt;p&gt;А всё дальнейшее – это расширения.&lt;/p&gt;  &lt;p&gt;По сути, их несколько: новые ключевые слова, которые начинаются с символа ‘@’ (&lt;a href=&quot;http://ru.wikipedia.org/wiki/@&quot;&gt;коммерческое At&lt;/a&gt;), посылка сообщения, обрамляемое квадратными скобками, и &lt;em&gt;всё&lt;/em&gt;. Остальное делает рантайм – то есть библиотеки.&lt;/p&gt;  &lt;p&gt;Например:&lt;/p&gt; &lt;style type=&quot;text/css&quot;&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;p&gt;   &lt;pre class=&quot;csharpcode&quot;&gt;#import &amp;lt;stdio.h&amp;gt;
#import &amp;lt;objc/Object.h&amp;gt;

@&lt;span class=&quot;kwrd&quot;&gt;interface&lt;/span&gt; MyObject : Object
{
    &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; field;
}

-init;
-(&lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt;) Hello: (&lt;span class=&quot;kwrd&quot;&gt;char&lt;/span&gt;*) s;

@end

@implementation MyObject

-init
{
    [super init];

    field = 5;
}

-(&lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt;) Hello: (&lt;span class=&quot;kwrd&quot;&gt;char&lt;/span&gt;*) s
{
    printf(&lt;span class=&quot;str&quot;&gt;&amp;quot;%s\n&amp;quot;&lt;/span&gt;, s);
}

@end

&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; main(&lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt;)
{
    MyObject* myObjectInstance = [[MyObject alloc] init];        
    
    [myObjectInstance Hello: &lt;span class=&quot;str&quot;&gt;&amp;quot;Hello, World!&amp;quot;&lt;/span&gt;];
    
    [myObjectInstance free];
}&lt;/pre&gt;
  &lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;Разбираем, по очереди.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#import&lt;/strong&gt; – замена стандартного, и набившего всем C++-сникам оскомину, &lt;strong&gt;#include&lt;/strong&gt;, – отличие с том, что #import включается ровно один раз при компиляции (да-да, та самая &lt;strong&gt;#pragma once&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;objc/Object.h&lt;/strong&gt; – базовый объект для всех объектов языка Objective-C. Он не является обязательным, но управление памятью реализовано в нём.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@interface&lt;/strong&gt; – первое новое ключевое слово – это объявление нового объекта, содержит во-первых поля объекта (обычная C-структура) и объявления методов объекта в специфическом стиле.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@implementation – &lt;/strong&gt;реализация объявленных в &lt;strong&gt;@interface&lt;/strong&gt; методов объекта.&lt;/p&gt;

&lt;p&gt;И самое интересное – это посылка сообщений.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MyObject *&lt;/strong&gt; – указатель на объект.&lt;/p&gt;

&lt;pre class=&quot;csharpcode&quot;&gt;[ObjectInstance Message: Parameter]&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Итак, это обычные квадратные скобки, которые обозначают посылку сообщения &lt;strong&gt;Message&lt;/strong&gt; некоторому объекту &lt;strong&gt;ObjectInstance&lt;/strong&gt;. Сообщение может содержать упакованные параметры &lt;strong&gt;Parameter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Суть примерно та же, что и в SmallTalk. Объекту можно посылать любые сообщения, обработаны будут только те, которые явно поддерживает объект.&lt;/p&gt;

&lt;p&gt;В моём примере, происходит посылка четырёх сообщений:&lt;/p&gt;

&lt;p&gt;&amp;#160; 1) &lt;strong&gt;[MyObject alloc]&lt;/strong&gt; – посылка сообщения классу &lt;strong&gt;MyObject&lt;/strong&gt; о выделении памяти и создании объекта этого типа.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Да, да, посылка сообщения происходит именно классу объектов. Классы объектов – являются самостоятельными объектами и все создаются во время старта приложения. Соответственно, возможно им посылать сообщения, и доступна интроспекция.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160; 2) Возвращаемому результату обработки сообщения (это указатель на созданный объект) посылается сообщение &lt;strong&gt;init&lt;/strong&gt;, которое в языке Objective C является соглашением об инициализации объекта (конструктор в терминах других языков).&lt;/p&gt;

&lt;p&gt;&amp;#160; 3) &lt;strong&gt;[myObjectInstance Hello: &lt;span class=&quot;str&quot;&gt;&amp;quot;Hello, World!&amp;quot;&lt;/span&gt;]&lt;/strong&gt; – посылка сообщения Hello c параметром.&lt;/p&gt;

&lt;p&gt;&amp;#160; 4) &lt;strong&gt;[myObjectInstance free]&lt;/strong&gt; – освобождение памяти, ранее выделенной под объект через cообщение &lt;strong&gt;alloc&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Строго говоря, вызов free – необязательно приводит к освобождению памяти, в связи с тем, что в Objective C для управления памятью используется подсчёт ссылок, а в некоторых случаях и GC.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;Рантайм&lt;/h4&gt;

&lt;p&gt;Существует два немного различающихся рантайма: входящий в поставку GCC и от Apple. Отличия у них незначительные. Главное различие – это политика именования заголовочных файлов и классов объектов у Apple: везде добавляется префикс &lt;strong&gt;NS&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: NS – это сокращение от названия &lt;a href=&quot;http://en.wikipedia.org/wiki/NextStep&quot;&gt;NextStep&lt;/a&gt;, историческое название предшественника сегодняшней MAC OS. Набор библиотек для Objective C под Windows доступен в пакете &lt;a href=&quot;http://www.gnustep.org/experience/Windows.html&quot;&gt;GNUStep&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Примеры:&lt;/p&gt;

&lt;pre class=&quot;csharpcode&quot;&gt;GCC: #import &amp;lt;objc/Object.h&amp;gt;

 Apple: #import &amp;lt;Foundation/NSObject.h&amp;gt;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Аналогичный эппловскому набор рантайм-библиотек (в пределах небольших изменений) поставляется с библиотеками GNUStep.&lt;/p&gt;

&lt;h4&gt;Литература&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.blogger.com/profile/17803764860500024863&quot;&gt;lyxite&lt;/a&gt;: &lt;a href=&quot;http://blog.lyxite.com/2008/01/compile-objective-c-programs-using-gcc.html&quot;&gt;Compile Objective-C Programs Using gcc&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;Apple: &lt;a href=&quot;http://http://developer.apple.com/library/ios/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_index.html&quot;&gt;Learning Objective-C: A Primer&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;Wikipedia: &lt;a href=&quot;http://ru.wikipedia.org/wiki/Objective_C&quot;&gt;Objective-C&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://www.otierney.net/objective-c.html&quot;&gt;Objective-C Begginer’s Guide&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://andir-notes.blogspot.com/feeds/4733853149963176736/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://andir-notes.blogspot.com/2011/09/objective-c.html#comment-form' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default/4733853149963176736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default/4733853149963176736'/><link rel='alternate' type='text/html' href='http://andir-notes.blogspot.com/2011/09/objective-c.html' title='Мини-гайд по началам изучения Objective C'/><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9Ds9YWm9MkGJSeBk8P8VJ7waVpckQUSNPW7v_3e94q_1X2YSP3NBJcQlPyEoF59YRqylfVIyS21G5JgJ-rRw3vmbG3HQ26BGwXx9m_D9znsc__aHFlI-_AIRyBXUnLZjsjNFz0C2Wdm0/s72-c?imgmax=800" height="72" width="72"/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7550093075906678978.post-2294486991623320295</id><published>2010-02-23T14:08:00.001+03:00</published><updated>2010-02-23T14:38:42.558+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="debug"/><category scheme="http://www.blogger.com/atom/ns#" term="tools"/><category scheme="http://www.blogger.com/atom/ns#" term="visual studio"/><title type='text'>IntelliTrace – новый инструмент для отладки в Visual Studio 2010</title><content type='html'>&lt;p&gt;Совсем недавно &lt;a href=&quot;http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx&quot;&gt;вышел&lt;/a&gt; Release Candidate для Visual Studio 2010. Новая студия стала гораздо стабильнее и быстрее, так что пора уже обращать внимание на её новые возможности, а не только на свеженький WPF-интерфейс.&lt;/p&gt;  &lt;p&gt;Около полугода назад я &lt;a href=&quot;http://andir-notes.blogspot.com/2009/08/visual-studio-2010-historical-debugger.html&quot;&gt;упоминал&lt;/a&gt; про новую штуку, которую можно найти в Visual Studio 2010: Historical Debugger. Это имя оказалось внутренним, в релиз-кандидате эта возможность называется уже по-другому: IntelliTrace. По-русски это должно звучать, примерно как, “Умный следопыт”.&lt;/p&gt;  &lt;p&gt;Посмотрим на него (на следопыта) вживую!&lt;/p&gt;  &lt;h4&gt;Введение&lt;/h4&gt;  &lt;p&gt;Отладка в современных условиях обычно выполняется одним из следующих методов:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Printf-like отладка, &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;вывод информации во время исполнения программы во внешний поток: консоль, файл и т.п.,&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Использование интегрированного отладчика, &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;пошаговое выполнение программы под строгим наблюдением с инструментами установки контрольных точек и просмотром значений в переменных, регистрах и т.д.,&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;IntelliTrace это логичное продолжение и совмещение двух этих методов. Записываем всю нужную информацию во время работы приложения и затем можем в любой момент пронаблюдать состояние программы в каждой из записанных точек.&lt;/p&gt;  &lt;p&gt;Понятно, что совсем всю информацию о выполнении приложения записать не получится – это и существенное замедление работы программы и огромный объём данных, поэтому записывается лишь определённый расширяемый набор событий, которые представляются важными для приложения.&lt;/p&gt;  &lt;p&gt;Новый инструмент, несомненно, представляет собой следующий этап развития средств отладки в интегрированных средах разработки.&lt;/p&gt;  &lt;h4&gt;Из огня да в полымя&lt;/h4&gt;  &lt;p&gt;Начнём с наскоку методом интуитивного изучения. Запускаем Visual Studio 2010 RC и создаём простое консольное приложение. Код минимальный, только для демонстрации.&lt;/p&gt;  &lt;div style=&quot;font-family: consolas; background: white; color: black; font-size: 10pt&quot;&gt;   &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;Program&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;void&lt;/span&gt; Main(&lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;WriteLine(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;Hello, IntelliTrace World!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ReadKey();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Запускаем. На консоль будет выведено сообщение и программа начнёт ждать нажатия клавиши (&lt;em&gt;Console.ReadKey&lt;/em&gt;). Этого вполне достаточно.&lt;/p&gt;

&lt;p&gt;Открываем окно “IntelliTrace”, если его ещё не видно: &lt;em&gt;Debug&lt;/em&gt; –&amp;gt; &lt;em&gt;Windows&lt;/em&gt; –&amp;gt; &lt;em&gt;IntelliTrace Calls&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjerHukNM2hduGfyko5ikFeUMi_6tiPA2jmrHoPlz-ycNWop-AAa_M9VtyoIl5KdPuikQSOKfXiO94bWGDzv4DbAILkNouPzgkUD3M-iIiQIMmbcR6ozQlwGdvX65g-eu3fHOQXgR_DQPQ/s1600-h/Intellitrace%20Calls%5B6%5D.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: Intellitrace Calls&quot; border=&quot;0&quot; alt=&quot;Скриншот: Intellitrace Calls&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxbAw60qwbKxvGmaagVbwYHCUMQKhvscYRQF7wWnMP0WkS1H34YWYfsZMTAeLmPD9QXXllAOndeFry-ZF-GDHa9eaLUVkgbOXCiLq6pllI0Yuv9WKP1CDQqTcfIJo8tRzLCvN7TT1wcKU/?imgmax=800&quot; width=&quot;425&quot; height=&quot;425&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Всё что нужно далее для активации инструмента написано прямо в этом окне.&lt;/p&gt;

&lt;p&gt;Нажимаем кнопку и программа останавливается. Теперь можно увидеть лог событий, которые были записаны IntelliTrace’ом.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: Intellitrace Calls&quot; border=&quot;0&quot; alt=&quot;Скриншот: Intellitrace Calls&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG_Ycx50EdHZDjBpL5sLnnuzsyVu0srIucvQRSDWJR71UQbR62Ycvf1yoCeCpGDni5zT3Z-EyGNvYORy3yyBgUT8BQcRmlo8SET1QgDWpEkqAIzq5Lcr-15sikCnwKQltzXv1qn5Diunw/?imgmax=800&quot; width=&quot;753&quot; height=&quot;368&quot; /&gt; &lt;/p&gt;

&lt;p&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: Intellitrace Calls&quot; border=&quot;0&quot; alt=&quot;Скриншот: Intellitrace Calls&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdK3rwkpIcBRikbN-N_cvtvoiRcIoKaXGU5hpENOC6PTu2hfD7Y9tCIduUEUmROjM9sQPQca24KOCQZI5o8vZgOiX1ns744vhTKve2QcogtdIAcHoA6WhXGuIY4RuFdKg-P8LbSvqdMfM/?imgmax=800&quot; width=&quot;470&quot; height=&quot;283&quot; /&gt; &lt;/p&gt;

&lt;p&gt;В списке событий появилось два события: &lt;strong&gt;Beginning of Application&lt;/strong&gt; и &lt;strong&gt;Debugger Break&lt;/strong&gt;. Ничего примечательного, но для начала сойдёт.&lt;/p&gt;

&lt;p&gt;Если выбрать любое событие, то точка останова в программе перемещается на место, где это событие произошло и в окне можно просмотреть подробную информацию о событии.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeLTz-QcbPetdSpHCA7SNCPnQp5h7dbj-252gQdYhL4iR1EsDPeqaAUpN8hxEXZmn9hJEel5Bcnf8Kez23epQj2Pt11s35d9LZ-sPBZfZGrfFu8yZ2feTwjHBpYW9RCwFixU35z86E-iw/s1600-h/IntelliTraceLogSelectedEvent%5B4%5D.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: Intellitrace Calls&quot; border=&quot;0&quot; alt=&quot;Скриншот: Intellitrace Calls&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-cloOAnEtNaKfe3ZcBBV9v8fywre0uOyJzBMP_qDq3PKlGAFADfwuKbe7Ln3vDBRv8vDc2nEBPG-1Cr82PmVVXG_pehIzOhU1ZcqFTGlqaLQU4yYbz49zFfftzlMFv8luyi9rbgI3amc/?imgmax=800&quot; width=&quot;467&quot; height=&quot;252&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;Настройки&lt;/h4&gt;

&lt;p&gt;Для настройки работы IntelliTrace появился целый узел в дереве Options:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: Настройки IntelliTrace&quot; border=&quot;0&quot; alt=&quot;Скриншот: Настройки IntelliTrace&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWWlOEqkTUkMlwmBdyJqYf8xbn07eVyWMV9V942OR7TctxQpOVBHqmGJvjyx02SyuMhIedDbe6MCDI5IiRzA_RxwO0jOhlTnmo5N5-_xYvotxDE1q5KXkd_2OKgvoMPsIOqRxeJo16XZk/?imgmax=800&quot; width=&quot;866&quot; height=&quot;582&quot; /&gt; &lt;/p&gt;

&lt;p&gt;IntelliTrace может работать в двух режимах: &lt;em&gt;IntelliTrace events only&lt;/em&gt; и &lt;em&gt;IntelliTrace events and call information&lt;/em&gt;, которые определяют уровень и количество записываемой информации. Оба режима настраиваются и позволяют определять какие именно события записывать, а какие игнорировать.&lt;/p&gt;

&lt;p&gt;Если перейти на подузел настроек &lt;em&gt;IntelliTrace Events&lt;/em&gt;, то можно увидеть тот самый список значимых событий, который подготовили в Microsoft:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: IntelliTrace -&amp;gt; IntelliTrace Events&quot; border=&quot;0&quot; alt=&quot;Скриншот: IntelliTrace -&amp;gt; IntelliTrace Events&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj873km3vigRp-qyWxsF6mVVC1TQ9CaGIqSpQM7nmXeQwECk2twTae0-hsP8mHn217uhGkyBjgZbz3cNEGju_JZKvTWdlV26It_81yjkx_Se44MJ1PFbZbh2kKGLzO490oNW-7n27DeegY/?imgmax=800&quot; width=&quot;866&quot; height=&quot;582&quot; /&gt; &lt;/p&gt;

&lt;p&gt;О! Это уже что-то, давайте добавим к нашему первому примеру запись всех событий Console. Отмечаем галочкой группу Console и запускаем:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: запуск программы с включенным логированием событий Console&quot; border=&quot;0&quot; alt=&quot;Скриншот: запуск программы с включенным логированием событий Console&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLi_wvt1fPIw3zUzoYhr5OzadHROFiO6RwNI9R0ZNLkzjcZsiQtbxKd3g7BbEPqYZob1zYvUx9_tFwdYFjqVuw73Sx6IfBtsDM-8CjKzeC7W9ErpyyO_HbTQ5C5AQ6FF5riOJjV263kEw/?imgmax=800&quot; width=&quot;651&quot; height=&quot;734&quot; /&gt; &lt;/p&gt;

&lt;p&gt;Теперь событий стало три. IntelliTrace залогировал событие вывода на консоль и мы можем легко перейти в это место и посмотреть состояние программы в этот момент.&lt;/p&gt;

&lt;p&gt;Теперь пора перейти к более сложному примеру.&lt;/p&gt;

&lt;h4&gt;Пример использования с ASP.Net MVC&lt;/h4&gt;

&lt;p&gt;Для большего понимания работы инструмента, продемонстрирую запуск IntelliTrace в случае приложения на базе фреймворка ASP.Net MVC 2. &lt;/p&gt;

&lt;p&gt;Создаём проект IntelliTrace.AspNetMvc в студии с помощью стандартного шаблона. Настраиваем IntelliTrace на логирование всех событий и информации о вызовах методов. И запускаем. Придётся подождать.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: запуск программы с включенным логированием событий Console&quot; border=&quot;0&quot; alt=&quot;Скриншот: запуск программы с включенным логированием событий Console&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_08nY06sAFbWIsE-7Vx0hQYoSU9h_ruqa0hG0re4vw6EkjjkdGavES3BbmNlqceE_RXxowR7XSj-gbCjCeZN_fctTCkARb88HQwICyCKko5fC1EUy17H5HoOABYTF_EQqhizGQYtbKDY/?imgmax=800&quot; width=&quot;563&quot; height=&quot;340&quot; /&gt; &lt;/p&gt;

&lt;p&gt;После этого жмём на Break All в инструменте IntelliTrace и смотрим на список залогированных событий:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: список событий залогированных IntelliTrace для ASP.Net Mvc приложения&quot; border=&quot;0&quot; alt=&quot;Скриншот: список событий залогированных IntelliTrace для ASP.Net Mvc приложения&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZtMaSGlwREWyG72YuXi6KqgYBHP8oAOMHYIZs4gXvB2PA6CpYvbyPVtyaYKqWJpRePc64oWJ0q7-V03XFn0vivl_bvGN0vCT0HnajhBr1gtuCPTnPFISmarbi20z4Mjf-rOYAPPGdQe8/?imgmax=800&quot; width=&quot;791&quot; height=&quot;763&quot; /&gt; &lt;/p&gt;

&lt;p&gt;В этот список попали два вида событий: Исключения (брошенные и пойманные) и события ASP.Net (HTTP-запрос и сохранение состояния).&lt;/p&gt;

&lt;p&gt;Так как мы включили логирование ещё и всех вызовов, то сверху окна IntelliTrace появилась возможность переключится на Calls View – список вызовов.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: стэк вызовов для данного события залогированного IntelliTrace для ASP.Net Mvc приложения&quot; border=&quot;0&quot; alt=&quot;Скриншот: стэк вызовов для данного события залогированного IntelliTrace для ASP.Net Mvc приложения&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifJSASmcD0zyXkAIltierL2S1ZFIepNu66uR_Ofe-GrAMCXFjhbhezsPbcnspyJm9G-BYyMP06wYEkJigvqbHQsDy7iI-8lExYX7q61KZ_sK1TX2yHs89SomvEgku9yTmaSDZNkiqvces/?imgmax=800&quot; width=&quot;663&quot; height=&quot;229&quot; /&gt; &lt;/p&gt;

&lt;p&gt;В этом окне пока ничего интересного не видно. &lt;/p&gt;

&lt;p&gt;Рассмотрим одно из залогированных событий. Пусть это будет событие ASP.Net: GET ‘/’.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: стэк вызовов для данного события залогированного IntelliTrace для ASP.Net Mvc приложения&quot; border=&quot;0&quot; alt=&quot;Скриншот: стэк вызовов для данного события залогированного IntelliTrace для ASP.Net Mvc приложения&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC9s_v_yMJpzkE80bpXjZrzgcopxiR7oeASZaW5MZ4rGVXmYBom27faiLTWK5iTdld1PQ8PAacrPXWdB8UfaVPe9a8Psa6hA2FV6QJkR04CiQl6BmAg0GHqjEAjL2NybRjXcN-prHQnOc/?imgmax=800&quot; width=&quot;797&quot; height=&quot;718&quot; /&gt; &lt;/p&gt;

&lt;p&gt;При выборе этого события становится видна дополнительная информация о событии и набор ссылок, которые указывают на связанную с этим событием информацию: залогированные вызовы методов (Calls View), локальные данные (Locals) и стэк вызовов (Call Stack):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IntelliTrace Calls View:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: Залогированные вызовы методов для точки IntelliTrace&quot; border=&quot;0&quot; alt=&quot;Скриншот: Залогированные вызовы методов для точки IntelliTrace&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3IfV6yaVmSFAdre1U0wzQZPWoUrPYyhP0IZwHlXNqH1m1xCNjRQ7f6rUlMy4cH_TVzu0pFwOni8A1T0C6FDb25lgLq2dgsSyLIAy0W-rIFScmDZx8r1ocxarKmu8aHXF7mqStECh6WIg/?imgmax=800&quot; width=&quot;680&quot; height=&quot;630&quot; /&gt; &lt;/p&gt;

&lt;p&gt;Вот теперь в окне Calls View теперь стало гораздо больше информации: появился контекст события: стало видно какие из записанных событий IntelliTrace предшествовали данному, какие происходили после. В данном окне можно перемещаться по событиям и просматривать связанную с ними информацию.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IntelliTrace Locals:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtWEn9tVJQ-2SOJV3njN3xmA6_GwvlMygcg-6Te6pp0cPq9mLkucBh6l1ml5kT4slQPXaxE6Be4B8KH_Ogprcoz4WfXVzRmioAklv_rkWFLjNS2y7SeO2rDJ1aDvay5zWUA4I-dChYnDg/s1600-h/AspNetMvcIntelliTraceLocalsForGet%5B4%5D.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: локальные данные для точки IntelliTrace&quot; border=&quot;0&quot; alt=&quot;Скриншот: локальные данные для точки IntelliTrace&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTnVk4uKgf7Kqgb7z3ruGaoEqiApEt3Qwudkmu_NM-Wqvv6m3KCsXjgVzXQn4ZTRy2WyHY3zVM8Kh-dts4Xk0PhUe4RCYaftGTeCea0Qpd7eT1mr5rWiEDXYpUwQrnJYEgwCl7oz2Yy8Y/?imgmax=800&quot; width=&quot;588&quot; height=&quot;352&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;В окне Locals отображается та информация, которая существенна для данного события: HTTP-метод, который использовался для доступа и Url. Набор этой информации весьма ограничен и определяется настройками этого типа событий IntelliTrace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IntelliTrace Stack Trace:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: Стэк вызовов для точки IntelliTrace&quot; border=&quot;0&quot; alt=&quot;Скриншот: Стэк вызовов для точки IntelliTrace&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJdY-6NId0sz5MDszYFii5cP9gcSkv1hJjQfp6x13a9xDbcwPJckE1y5QAJLkX_LHtIB7tlmK-LXk5HHR2MadF6iSgUtzOWyqs5hga4RmABPxGMoiZm2Ayz91A_9Gkpke-2LHUMw1bN5Y/?imgmax=800&quot; width=&quot;587&quot; height=&quot;353&quot; /&gt; &lt;/p&gt;

&lt;p&gt;Собственно снимок стэка исполнения в данной точке, хорошо известный всем разработчикам под .Net, кто хотя бы раз сталкивался с отладкой своего приложения.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Но, честно говоря, информации о конкретном событии в заданной точке IntelliTrace залогировано достаточно мало. Хотелось бы видеть немного больше информации: например состояние HttpContext для данного вызова, данные Htpp-запроса и т.п.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;Технические детали&lt;/h4&gt;

&lt;p&gt;IntelliTrace как и Code Contracts во время своей работы инжектит специальные методы в результирующую сборку (Post Build IL Rewriting). &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Кодовое имя IntelliTrace, которое довольно часто встречается в реестре и файлах VS 2010: Proteus.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Фактически сам IntelliTrace реализован как отдельный процесс, который запускается отдельно с помощью консольной программы &lt;em&gt;%ProgramFiles%\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools\IntelliTrace.exe&lt;/em&gt;. Поэтому во время любого сеанса IntelliTrace этот процесс можно обнаружить у себя в диспетчере задач.&lt;/p&gt;

&lt;p&gt;Запускается он обычно где-то так:&lt;/p&gt;

&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;C:\Program Files\Micrsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools\IntelliTrace.EXE&amp;quot;&lt;/span&gt; 
    run 
    /n:&lt;span class=&quot;str&quot;&gt;&amp;quot;intellitrace.console.vshost.exe_00000ba0_01cab4109a27f296&amp;quot;&lt;/span&gt; 
    /cp:&lt;span class=&quot;str&quot;&gt;&amp;quot;C:\Users\Andir\AppData\Local\Microsoft\VisualStudio\10.0\TraceDebugger\Settings\zrnoutrh.ozc&amp;quot;&lt;/span&gt; 
    /f:&lt;span class=&quot;str&quot;&gt;&amp;quot;IntelliTrace.Console.vshost_00000ba0_100223_014433.iTrace&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Параметры: /n – это имя логгера, /cp – это путь до файла с настройками, /f – имя файла, в который будет складываться информация.&lt;/p&gt;

&lt;p&gt;Вся информация, которая сохраняется во время сеанса IntelliTrace исполнения программы пишется в специальный файл бинарного формата, который находится в папке &lt;em&gt;%ProgramData%\Microsoft Visual Studio\10.0\TraceDebugging\ &lt;/em&gt;и имеет расширение *.iTrace. Visual Studio во время сеанса отладки с использованием IntelliTrace загружает этот файл и использует для навигации по точкам исполнения и загрузки информации записанной в этих точках.&lt;/p&gt;

&lt;p&gt;Настройки по умолчанию IntelliTrace находятся в файле: &lt;em&gt;%ProgramFiles%\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools\en\CollectionPlan.xml&lt;/em&gt;. К сожалению, Visual Studio напрямую не использует этот файл для настройки IntelliTrace. Перед запуском IntelliTrace.exe студия копирует (сериализует) собственные настройки IntelliTrace в отдельный файл в папке: &lt;em&gt;%LocalAppData%\Microsoft\VisualStudio\10.0\TraceDebugger\Settings\&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Взглянем на файл c настройками поподробнее:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Скриншот: файл с настройками IntelliTrace&quot; border=&quot;0&quot; alt=&quot;Скриншот: файл с настройками IntelliTrace&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8YCJ__cPiJiHtanLvi920VhEgtzPtkW2BidxmV1S21DudLOkGLHT9J9DNGygFpn5tK-HEjlharFpgc_jEsSxT5kiiXj5Ujy-w7NoVvBCFGpKJO3joqKSRcA0_bNKahKN_-qUkznf6BOQ/?imgmax=800&quot; width=&quot;804&quot; height=&quot;466&quot; /&gt; &lt;/p&gt;

&lt;p&gt;Ничего специфического в этом файле на первый взгляд не видно: здесь просто собраны все те настройки, что видно в диалоге Options –&amp;gt; IntelliTrace и в студии. Но давайте приглядимся к одной немаловажной детали: TracePointProvider и DiagnosticEventSpecification. &lt;/p&gt;

&lt;p&gt;Из их названий, собственно, уже понятно, что так скомпонованы провайдер точек, которые будет записывать IntelliTrace. А DiagnosticEventSpecification – определяет спецификацию одной из таких точек. Рассмотрим спецификацию события Console.WriteLine:&lt;/p&gt;

&lt;div style=&quot;font-family: consolas; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DiagnosticEventSpecification&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;enabled&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;false&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;CategoryId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;console&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;CategoryId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;SettingsName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;_locID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;settingsName.Console.WriteLine.Object&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;WriteLine (Object)&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;SettingsName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;SettingsDescription&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;_locID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;settingsDescription.Console.WriteLine.Object&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;Console Output with an Object passed in.&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;SettingsDescription&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Bindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Binding&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;ModuleSpecificationId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;mscorlib&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;ModuleSpecificationId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TypeName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;System.Console&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TypeName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;MethodName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;WriteLine&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;MethodName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;MethodId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;System.Console.WriteLine(System.Object):System.Void&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;MethodId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;ProgrammableDataQuery&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;ModuleName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;Microsoft.VisualStudio.DefaultDataQueries.dll&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;ModuleName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TypeName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;Microsoft.VisualStudio.DataQueries.Console.Output.WriteLineDataQuery&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TypeName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;ProgrammableDataQuery&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Binding&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Bindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DiagnosticEventSpecification&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Итак, первое что мы видим - это набор настроек точки: категория, название, описание. Второе – это некоторые &lt;em&gt;Bindings&lt;/em&gt;, которые очевидно и связывают точку и те данные, которые записываются в этой точке.&lt;/p&gt;

&lt;p&gt;Для события Console.WriteLine существует всего один биндинг, который определяет метод System.Console.WriteLine с двумя аргументами. ModuleSpecificationId – это сборка, в которой находится искомый метод, TypeName – имя типа, MethodName – имя метода и MethodId – это искомая перегрузка данного метода.&lt;/p&gt;

&lt;p&gt;И последнее что мы видим – это некоторый ProgrammableDataQuery – который по сути является основой для IntelliTrace в получении информации о событии в точке записи. &lt;/p&gt;

&lt;p&gt;Воспользовавшись рефлектором можно обнаружить, что ProgrammableDataQuery – это управляемый класс (в вышеприведённом примере это Microsoft.VisualStudio.DataQueries.Console.Output.WriteLineDataQuery), который отнаследован от интерфейса IProgrammableDataQuery:&lt;/p&gt;

&lt;div style=&quot;font-family: consolas; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IProgrammableDataQuery&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: green&quot;&gt;// Methods&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt;[] EntryQuery(&lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt; thisArg, &lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt;[] ExitQuery(&lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt; returnValue);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;List&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;CollectedValueTuple&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; FormatCollectedValues(&lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt;[] results);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; FormatLongDescription(&lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt;[] results);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; FormatShortDescription(&lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt;[] results);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;List&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;Location&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetAlternateLocations(&lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt;[] results);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Гораздо чаще, чем ProgrammableDataQuery, в CollectionPlan.xml используется DataQuery. Судя по всему – это стандартная реализация, которая автоматически получает данные от текущего класса (очень похоже на Reflection). В параметрах задаётся путь к определённой внутренней переменной класса:&lt;/p&gt;

&lt;div style=&quot;font-family: consolas; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DiagnosticEventSpecification&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;CategoryId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;system.data&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;CategoryId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;SettingsName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;_locID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;settingsName.OdbcCommand.ExecuteReader&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;ExecuteReader (ODBCCommand)&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;SettingsName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;SettingsDescription&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;_locID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;settingsDescription.OdbcCommand.ExecuteReader&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;Command text was executed, building an OdbcDataReader using one of the CommandBehavior values. (just test)&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;SettingsDescription&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Bindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Binding&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;ModuleSpecificationId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;system.data&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;ModuleSpecificationId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TypeName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;System.Data.Odbc.OdbcCommand&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TypeName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;MethodName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;ExecuteReader&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;MethodName&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;MethodId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;System.Data.Odbc.OdbcCommand.ExecuteReader(System.Data.CommandBehavior):System.Data.Odbc.OdbcDataReader&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;MethodId&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;ShortDescription&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;_locID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;shortDescription.OdbcCommand.ExecuteReader&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;Execute Reader &amp;quot;{0}&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;ShortDescription&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;LongDescription&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;_locID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;longDescription.OdbcCommand.ExecuteReader&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;The command text &amp;quot;{0}&amp;quot; was executed on connection &amp;quot;{1}&amp;quot;, building an OdbcDataReader using one of the CommandBehavior values.&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;LongDescription&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataQueries&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataQuery&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;0&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;maxSize&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;4096&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;String&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;Command Text&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;_locID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;dataquery.OdbcCommand.ExecuteReader.CommandText&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;_locAttrData&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;name&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&lt;strong&gt;_commandText&lt;/strong&gt;&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataQuery&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataQuery&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;0&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;maxSize&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;256&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;String&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;Connection String&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;_locID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;dataquery.OdbcCommand.ExecuteReader.ConnectionString&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;_locAttrData&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;name&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&lt;strong&gt;_connection._userConnectionOptions._usersConnectionString&lt;/strong&gt;&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataQuery&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataQueries&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Binding&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Bindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DiagnosticEventSpecification&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Как видно, в данном случае, с помощью запросов получают из параметра с индексом 0 (это this) строку соединения (Connection String) и команду SQL (Command Text).&lt;/p&gt;

&lt;p&gt;Судя по файлу CollectionPlan.xml, механизм IntelliTrace представляет собой хорошо расширяемую платформу. Но пока Visual Studio не предоставляет никаких механизмов для добавления, например, своих событий для записи. Единственное, что возможно – это создавать свои собственные iTrace файлы для определённой конфигурации CollectionPlan. Полагаю, что это задел на будущее для каких-то новых инструментов, например Code Coverage. &lt;/p&gt;

&lt;h4&gt; Заключение&lt;/h4&gt;

&lt;p&gt;Описанный новый инструментарий для разработчика в такой консервативной области как отладка приложений выглядит очень многообещающе. Предполагаю, что скорее всего логирование IntelliTrace в релизе будет включено по умолчанию и позволит разработчикам видеть все ключевые точки работы приложения прямо во время разработки.&lt;/p&gt;

&lt;p&gt;Ещё более многообещающей выглядит область будущих применений *.iTrace файлов. Собранная информация позволит анализировать работу приложений как в ручном, так и в автоматическом режиме. Это поможет выявлять ошибки, собирать статистику о работе приложения, реализовывать автоматические функциональные тесты основанные на точках, которые должно пройти приложение и т.п.&lt;/p&gt;

&lt;h4&gt;Литература для дальнейшего изучения&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;MSDN, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd264915%28VS.100%29.aspx&quot;&gt;Debugging With IntelliTrace&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;Ian Huf blog: &lt;a href=&quot;http://blogs.msdn.com/ianhu/default.aspx&quot;&gt;IntelliTrace Info&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;John Robbins blog*: &lt;a href=&quot;http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/10/19/vs-2010-beta-2-intellitrace-in-depth-first-look.aspx&quot;&gt;VS 2010 Beta 2 IntelliTrace In-Depth First Look&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;John Robbins blog: &lt;a href=&quot;http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/06/16/how-does-vs2010-historical-debugging-work.aspx&quot;&gt;How Does VS2010 Historical Debugging Work?&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;Habib Heydarian blog: &lt;a href=&quot;http://blogs.msdn.com/habibh/archive/2009/09/21/coverage-of-the-visual-studio-2010-historical-debugger.aspx&quot;&gt;Coverage of the Visual Studio 2010 Historical Debugger&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;Ian Huf blog: &lt;a href=&quot;http://blogs.msdn.com/ianhu/archive/2010/02/10/intellitrace-and-collectionplan-xml.aspx&quot;&gt;IntelliTrace and CollectionPlan.xml&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;* – John Robbins, Джон Роббинс – автор известной книги “Отладка приложений для Microsoft .NET и Microsoft Windows”.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://andir-notes.blogspot.com/feeds/2294486991623320295/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://andir-notes.blogspot.com/2010/02/intellitrace-new-tool-for-debugging-in.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default/2294486991623320295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default/2294486991623320295'/><link rel='alternate' type='text/html' href='http://andir-notes.blogspot.com/2010/02/intellitrace-new-tool-for-debugging-in.html' title='IntelliTrace – новый инструмент для отладки в Visual Studio 2010'/><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxbAw60qwbKxvGmaagVbwYHCUMQKhvscYRQF7wWnMP0WkS1H34YWYfsZMTAeLmPD9QXXllAOndeFry-ZF-GDHa9eaLUVkgbOXCiLq6pllI0Yuv9WKP1CDQqTcfIJo8tRzLCvN7TT1wcKU/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7550093075906678978.post-1240888670713938885</id><published>2009-09-13T14:49:00.001+04:00</published><updated>2009-09-13T14:51:47.882+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="asp.net"/><title type='text'>Пример декларативного биндинга asp:TreeView</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Рассмотрим пример биндинга asp:TreeView к XmlDataSource.&lt;/p&gt;  &lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;   &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;background: #ffee62&quot;&gt;&amp;lt;%&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;@&lt;/span&gt; &lt;span style=&quot;color: #a31515&quot;&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;Language&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;MasterPageFile&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;AutoEventWireup&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;CodeBehind&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;TreeView.aspx.cs&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;Inherits&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Home.Andir.Examples.TreeViewPage&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;background: #ffee62&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Content&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeView&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;DataSourceID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;xmlDataSource&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataBindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeNodeBinding&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;TextField&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataBindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeView&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;XmlDataSource&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;xmlDataSource&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Data&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Root&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Root&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Node&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Node 1&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Node&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Node 2&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Node&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Node 3&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Node&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Node 3.1&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Root&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Data&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;XmlDataSource&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Content&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;И результат:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Скриншот: Результат выполнения декларативного биндинга к XmlDataSource&quot; border=&quot;0&quot; alt=&quot;Скриншот: Результат выполнения декларативного биндинга к XmlDataSource&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE-XpZbYHB8kQmyJJFq5FD2yCNjFIpouQqhiBxgdjhMxgTdQrBeeOFQOjAYHpaJliVqvwTGWeVhma2RQXeqsj6fbUiLBwqgdGV9PwkETZFrRvqNP57qr8oED12w3YY0P3tp7gVMIsF7SQ/?imgmax=800&quot; width=&quot;449&quot; height=&quot;334&quot; /&gt; &lt;/p&gt;

&lt;p&gt;Как видим, биндинг вполне прямолинейный и полностью декларативный, XML-данные можно хранить прямо в разметке или подгружать из внешнего файла (с помощью свойства &lt;strong&gt;DataFile&lt;/strong&gt;), мало того, XML можно перед биндингом трансформировать с помощью XSLT (с помощью свойства &lt;strong&gt;Transform&lt;/strong&gt;).&lt;/p&gt;

&lt;h4&gt;Пример биндинга к RSS&lt;/h4&gt;

&lt;p&gt;Необходимость писать дополнительный код появляется только если требуется получать XML от какого-то внешнего источника. Например, строить по данным из БД или получать RSS-фид из интернета.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;background: #ffee62&quot;&gt;&amp;lt;%&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;@&lt;/span&gt; &lt;span style=&quot;color: #a31515&quot;&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;Language&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;MasterPageFile&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;AutoEventWireup&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;CodeBehind&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;TreeView.aspx.cs&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;Inherits&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Home.Andir.Examples.TreeViewPage&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;background: #ffee62&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Content&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeView&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;DataSourceID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;feedDataSource&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataBindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;DataMember&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;feed&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;FormatString&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Блог: {0}&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;TextField&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;title&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;DataMember&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;entry&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;FormatString&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Запись: {0}&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;TextField&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;title&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;NavigateUrlField&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;url&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataBindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeView&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;XmlDataSource&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;feedDataSource&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Transform&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;xml&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;xsl&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;stylesheet&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #a31515&quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;xsl&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #a31515&quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;atom&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;http://www.w3.org/2005/Atom&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;exclude-result-prefixes&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;atom&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;xsl&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;template&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;match&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;atom:feed&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;feed&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;{atom:title}&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;xsl&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;apply-templates&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;feed&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;xsl&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;template&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;xsl&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;template&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;match&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;atom:entry&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;entry&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;{atom:title}&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;{atom:link[@rel=&#39;alternate&#39;]/@href}&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;xsl&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;apply-templates&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;entry&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;xsl&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;template&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;xsl&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;stylesheet&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Transform&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;XmlDataSource&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Content&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;и немного кода:&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Net;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Text;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;partial&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;TreeViewPage&lt;/span&gt; : System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Web&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;UI&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;void&lt;/span&gt; Page_Load(&lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt; sender, &lt;span style=&quot;color: #2b91af&quot;&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; rssFeedUrl &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;http://feeds2.feedburner.com/AndirNotes&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; feedDataSource&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Data &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DownloadRssFeed(rssFeedUrl);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; DownloadRssFeed(&lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; url)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; client &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;WebClient&lt;/span&gt;();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; resultBytes &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; client&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;DownloadData(url);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;Encoding&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;UTF8&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetString(resultBytes);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Результатом будет следующее дерево:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Скриншот: Результат выполнения биндинга к моему RSS&quot; border=&quot;0&quot; alt=&quot;Скриншот: Результат выполнения биндинга к моему RSS&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRWSkniWltu7RfpZM3ATnwBIfKY_WVGswhdFTzbm-xOcHTM9pK95O5Q2GvHfJHv04DuQ_BT79ESLRYNX_5d53eWsKO0FJtwzecWeNeCxQoIvz9cYotpyrAZknY9oR26KYAxz8Bvn1Py-E/?imgmax=800&quot; width=&quot;531&quot; height=&quot;312&quot; /&gt;&lt;/p&gt;

&lt;p&gt;В этом случае всё очень просто, однако для более изощрённых истоников иерархических данных может понадобится собственная реализация IHierarchicalDataSource. Вопросы реализации этого интерфейса рассматриваются в заметке: &lt;a href=&quot;http://andir-notes.blogspot.com/2009/09/ihierarchicaldatasource-generic.html&quot;&gt;Реализация обобщённого варианта IHierarchicalDataSource&lt;/a&gt;.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://andir-notes.blogspot.com/feeds/1240888670713938885/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://andir-notes.blogspot.com/2009/09/asptreeview-decrarative-binding.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default/1240888670713938885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default/1240888670713938885'/><link rel='alternate' type='text/html' href='http://andir-notes.blogspot.com/2009/09/asptreeview-decrarative-binding.html' title='Пример декларативного биндинга asp:TreeView'/><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE-XpZbYHB8kQmyJJFq5FD2yCNjFIpouQqhiBxgdjhMxgTdQrBeeOFQOjAYHpaJliVqvwTGWeVhma2RQXeqsj6fbUiLBwqgdGV9PwkETZFrRvqNP57qr8oED12w3YY0P3tp7gVMIsF7SQ/s72-c?imgmax=800" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7550093075906678978.post-5727684102915237804</id><published>2009-09-13T14:30:00.001+04:00</published><updated>2009-09-13T14:53:58.858+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="advanced"/><category scheme="http://www.blogger.com/atom/ns#" term="asp.net"/><title type='text'>Реализация обобщённого варианта IHierarchicalDataSource</title><content type='html'>&lt;p&gt;Задача отображения иерархических данных достаточно часто встречается в практике. Это и файловая структура (папка-&amp;gt;папка-&amp;gt;…-&amp;gt;файл), и&amp;#160; организационная структура компании (департамент-&amp;gt;отдел-&amp;gt;группа), и иерархия подчинения сотрудников (директор-&amp;gt;менеджер-&amp;gt;рядовой сотрудник), и проектная деятельность (группа проектов-&amp;gt;проект-&amp;gt;подсистема-&amp;gt;задача).&lt;/p&gt;  &lt;p&gt;В стандартной поставке ASP.Net есть два основных контрола, которые поддерживают отображение иерархических данных: &lt;strong&gt;asp:TreeView&lt;/strong&gt; и &lt;strong&gt;asp:Menu&lt;/strong&gt;. Кроме того, они также поддерживают биндинг с иерархическим источником данных, т.е. с таким источником, который реализует интерфейс &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;Источников, которые реализуют интерфейс &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt;, существует всего два, это: &lt;strong&gt;XmlDataSource&lt;/strong&gt; и &lt;strong&gt;SiteMapDataSource&lt;/strong&gt;. Кроме того, эти источники одновременно являются декларативными элементами UI, которые можно использовать в разметке.&lt;/p&gt;  &lt;p&gt;Например:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;XmlDataSource.aspx&lt;/strong&gt;&lt;/p&gt;  &lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;   &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;background: #ffee62&quot;&gt;&amp;lt;%&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;@&lt;/span&gt; &lt;span style=&quot;color: #a31515&quot;&gt;Page&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;Language&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;MasterPageFile&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;AutoEventWireup&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style=&quot;background: #ffee62&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Content&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeView&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;DataSourceID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;xmlDataSource&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataBindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;DataMember&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Root&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Root&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;DataMember&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Node&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;TextField&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataBindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeView&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;XmlDataSource&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;xmlDataSource&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Data&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Root&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Node&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Node 1&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Node&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Node 2&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Node&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Node 2.1&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Node&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Node 2.2&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Node&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Node 1&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Root&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Data&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;XmlDataSource&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Content&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Примечание: Более подробный пример использования биндинга asp:TreeView к XmlDataSource можно посмотреть в следующей &lt;a href=&quot;http://andir-notes.blogspot.com/2009/09/asptreeview-decrarative-binding.html&quot;&gt;заметке&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;А что, если требуется отобразить данные полученные из базы данных? Для этого придётся самостоятельно реализовывать указанный интерфейс &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;Модель&lt;/h4&gt;

&lt;p&gt;Рассмотрим типичную модель древовидных данных хранимых в БД:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Скриншот: Таблица в базе данных с типичной древовидной структурой&quot; border=&quot;0&quot; alt=&quot;Скриншот: Таблица в базе данных с типичной древовидной структурой&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6eNBI3or8fj8zA79NTmPyJd9Vj-p5oEJNjyWrYQmqdWxDG0ITEXNPZnxXaDdAqpsEgUqMv2PQtLFYulwXR3dss9TRd8Ib8S8MscEIjBypNWG43oHEi9qddK4c6svSUZ57xLevR_UuaDE/?imgmax=800&quot; width=&quot;650&quot; height=&quot;223&quot; /&gt; &lt;/p&gt;

&lt;p&gt;Как видно на скриншоте, модель представляет собой таблицу со следующими полями: ID – уникальный идентификатор записи, ParentID – ключ для связи с родительской записью или NULL – если запись является корневой.&lt;/p&gt;

&lt;p&gt;После извлечения данных, древовидные данные отображаются на конкретную модель. Рассмотрим две наиболее часто используемых модели.&lt;/p&gt;

&lt;p&gt;Первая – это прямолинейная проекция структуры БД на объект:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Скриншот: Диграмма классов для PlainTreeModel&quot; border=&quot;0&quot; alt=&quot;Скриншот: Диграмма классов для PlainTreeModel&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIS6ZUxJArRfhrPdJcXy7pz33WjxvRtel2FS0rrnyuPrrKAHiVdY5XGrjrPahnTky1iWqbM21vqEceJXuJEfzXsK8BoX2cquxr2fcbZsXLxWnso04QFRjWLArA6FdydwxQoP3c4sL1GP0/?imgmax=800&quot; width=&quot;478&quot; height=&quot;483&quot; /&gt; &lt;/p&gt;

&lt;p&gt;Второй вариант обычно возникает при использовании продвинутых средств отображения (ORM):&lt;/p&gt;

&lt;p&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Скриншот: Диаграмма классов для ORMTreeModel&quot; border=&quot;0&quot; alt=&quot;Скриншот: Диаграмма классов для ORMTreeModel&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4vL2o5fsroRKyy6YZPDgUWCS5xoe7LfvcCd7Kb8uJPCnkpBDWXe_6YMCr7lbsFWu6e_lLXh3X-t1huQNxOnbGnugUe9RLyn3DpepXm4HXIJe3THMUtso7-HUscJiHrIqz8qiouxEBzFs/?imgmax=800&quot; width=&quot;529&quot; height=&quot;503&quot; /&gt; &lt;/p&gt;

&lt;p&gt;В данном случае, видим что вместо одного поля &lt;strong&gt;ParentID&lt;/strong&gt; создано два дополнительных поля: &lt;strong&gt;Parent&lt;/strong&gt; и &lt;strong&gt;Children&lt;/strong&gt;. &lt;strong&gt;Parent&lt;/strong&gt; – это ссылка на родительский элемент &lt;strong&gt;ORMTreeModel&lt;/strong&gt;, а &lt;strong&gt;Children&lt;/strong&gt; – перебираемая последовательность дочерних объектов &lt;strong&gt;ORMTreeModel&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Представим себе, что нам требуется отобразить данные смоделированные подобным образом в контроле asp:TreeView. Для этого потребуется реализовать интерфейс &lt;strong&gt;IHierarchicalDataSource.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;Реализация интерфейса IHierarchicalDataSource&lt;/h4&gt;

&lt;p&gt;Любая реализация &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt; напрямую связана с реализацией абстрактного класса &lt;strong&gt;HierarchicalDataSourceView&lt;/strong&gt; и интерфейсов &lt;strong&gt;IHierarchicalEnumerable&lt;/strong&gt; и &lt;strong&gt;IHierarchyData&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Вот как это выглядит в виде диаграммы классов:&lt;/p&gt;

&lt;p&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Скриншот: Диаграмма классов для реализации IHierarchicalDataSource&quot; border=&quot;0&quot; alt=&quot;Скриншот: Диаграмма классов для реализации IHierarchicalDataSource&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-XxKJ3zX4VOk5xMxmfTl9VNQACFuIjNgxdkrLesdKYRYb_T4xREWV4qf4hk4At9yGYyU2L4taRcdIIVw-2CuKrD36la1befqvLJueRGJECr4spFZKDXMf1vbnHIpJbSNrV0d1Uk5ltaI/?imgmax=800&quot; width=&quot;695&quot; height=&quot;547&quot; /&gt; &lt;/p&gt;

&lt;p&gt;Центральным звеном реализации является IHierarchyData, который и абстрагирует модель древовидных данных.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: На скриншоте есть одна известная ошибка диаграммы классов генерируемой Visual Studio. Дизайнер диаграмм показывает поля с именем Item переименованными в this. Что хорошо видно в интерфейсе IHierarchyData. В данном случае, это конечно же неверно.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Также обратите внимание, что интерфейс IHierarchyData во многом повторяет класс ORMTreeModel приведённый выше.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Теперь определимся с задачей, которую нам предстоит решить. Нужно получать древовидные данные из внешнего источника данных и преобразовывать их к иерархическому источнику данных. Желательно абстрагироваться от конкретного источника и конкретного вида модели данных.&lt;/p&gt;

&lt;h4&gt;Типизированные обёртки для базовых интерфейсов&lt;/h4&gt;

&lt;p&gt;Для начала, сделаем некоторые приготовления и реализуем типизированные версии интерфейсов &lt;strong&gt;IHierarchyData&lt;/strong&gt; и &lt;strong&gt;IHierarchyEnumerable&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HierarchyData.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Web&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; : &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyData&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetParent();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetChildren();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;abstract&lt;/span&gt; T Item { &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IHierarchyData Members&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyData&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetParent()&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; GetParent();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;bool&lt;/span&gt; HasChildren { &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchicalEnumerable&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetChildren()&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; GetChildren();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Item&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; Item; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; Path { &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; Type { &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;HierarchyEnumerable.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Collections;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Web&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchicalEnumerable&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetHierarchyData(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T enumeratedItem);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IHierarchicalEnumerable Members&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyData&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchicalEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetHierarchyData(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt; enumeratedItem)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; GetHierarchyData((T)enumeratedItem);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IEnumerable Members&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerator&lt;/span&gt; GetEnumerator();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Всё максимально прямолинейно, просто прячем нетипизированные версии за явной реализацией интерфейса, а наружу выставляем только типизированные версии этих же методов и свойств.&lt;/p&gt;

&lt;h4&gt;Репозиторий&lt;/h4&gt;

&lt;p&gt;Определим интерфейс для обобщённого хранилища объектов, из которого мы будем получать данные для иерархического обхода:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IHierarchyDataRepository.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
    &lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
      &lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
        &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Collections&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;where&lt;/span&gt; T : &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt;&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T GetParent(T item);&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetChildren(T item);&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; GetItemType(T item);&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T GetItem(&lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; hierarchyPath);&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; GetItemHierarchyPath(&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; parentHierarchyPath, T item);&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

        &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Для чего нужен этот интерфейс? Он предназначен для абстрагирования от конкретных источников иерархических данных и его реализации должны быть привязаны к некоторому внешнему источнику.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Необходимо обратить внимание, что в данном варианте интерфейса и дальнейшей реализации используется неявное предположение для метода GetChildren: если передан параметр со значением &lt;strong&gt;null&lt;/strong&gt;, то реализация должна вернуть список корневых элементов дерева. Вообще, это не очень хорошее решение, и, с точки зрения архитектуры, гораздо лучше иметь отдельный метод для получения корневых элементов дерева.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Реализацию репозитория пока отложим и реализуем необходимые интерфейсы для &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt; предполагая, что данные поступают к нам из некоторого репозитория &lt;strong&gt;IHierarchyDataRepository&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GenericHierarchicalDataSource.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Web&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;sealed&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;GenericHierarchicalDataSource&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchicalDataSource&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;where&lt;/span&gt; T : &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; GenericHierarchicalDataSource(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; repository)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;repository &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IHierarchicalDataSource Members&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;event&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;EventHandler&lt;/span&gt; DataSourceChanged;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchicalDataSourceView&lt;/span&gt; GetHierarchicalView(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; viewPath)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;GenericHierarchicalDataSourceView&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repository, viewPath);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Итак, сам &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt; довольно примитивен: принимает в качестве параметров репозиторий и передаёт его дальше – реализации абстрактного &lt;strong&gt;HierarchicalDataSourceView&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GenericHierarchicalDataSourceView.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Web&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;sealed&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;GenericHierarchicalDataSourceView&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchicalDataSourceView&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;where&lt;/span&gt; T : &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; viewPath;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; GenericHierarchicalDataSourceView(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; repository, &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; viewPath)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;repository &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;viewPath &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; viewPath;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchicalEnumerable&lt;/span&gt; Select()&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;color: purple&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;IsNullOrEmpty(viewPath))&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; hierarchyItem &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;GenericHierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repository, viewPath);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; hierarchyItem&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetChildren();&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;GenericHierarchicalEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repository, &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;, repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetChildren(&lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Здесь нужно обратить внимание на параметр конструктора &lt;strong&gt;viewPath&lt;/strong&gt;, который представляет собой начальный путь обхода иерархического источника данных.&lt;/p&gt;

&lt;p&gt;В остальном реализация &lt;strong&gt;GenericDataSourceView&lt;/strong&gt; также не представляет интереса, всё передаётся на откуп двум оставшимся интерфейсам.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GenericHierarchicalEnumerable.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Collections;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Collections&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;sealed&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;GenericHierarchicalEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;where&lt;/span&gt; T : &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; enumerableList;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; GenericHierarchicalEnumerable(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; repository,&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; parent,&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; enumerableList&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; )&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;repository &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;parent &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;enumerableList &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; enumerableList;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IHierarchicalEnumerable Members&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetHierarchyData(T item)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;GenericHierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repository, parent, item);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IEnumerable Members&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerator&lt;/span&gt; GetEnumerator()&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; enumerableList&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetEnumerator();&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Этот интерфейс представляет собой расширение абстракции IEnumerable – перечислимых данных – до абстракции перечисление дерева с возможностью продвижения от некоторого корневого элемента дерева до его листьев.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IHierarchicalEnumerable&lt;/strong&gt; отличается от обычного &lt;strong&gt;IEnumerable&lt;/strong&gt; только дополнительным методом &lt;em&gt;GetHierarchyData&lt;/em&gt;, который предназначен для конвертации перебираемых элементов в реализацию иерархической модели &lt;strong&gt;HierarchyData&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GenericHierarchyData.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Collections&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Linq;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;sealed&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;GenericHierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;where&lt;/span&gt; T : &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; T item;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IList&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; children;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; path;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; type;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; GenericHierarchyData(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; repository,&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; itemPath)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;repository &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;item &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetItem(itemPath);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;parent &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;children &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetChildren(item)&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;path &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; itemPath;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;type &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetItemType(item);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; GenericHierarchyData(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; repository,&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; parent,&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T item&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; )&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;repository &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;item &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; item;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;parent &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;children &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetChildren(item)&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;path &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetItemHierarchyPath(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parent &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt; &lt;span style=&quot;color: purple&quot;&gt;?&lt;/span&gt; &lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt; : parent&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Path, item);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;type &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetItemType(item);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IHierarchyData Members&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchyData&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetParent()&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;bool&lt;/span&gt; HasChildren&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; children&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Count &lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;0&lt;/span&gt;; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetChildren()&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;GenericHierarchicalEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repository, &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;, children&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;override&lt;/span&gt; T Item { &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; item; } }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; Path { &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; path; } }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; Type { &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; type; } }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;В реализации &lt;strong&gt;IHierarchyData&lt;/strong&gt; фактически выполняется конечное извлечение данных из нашей абстракции репозитория иерархических данных.&lt;/p&gt;

&lt;p&gt;Используется два конструктора: первый предназначен для создания объекта от некоторого начального пути &lt;strong&gt;itemPath&lt;/strong&gt; в дереве, второй создаёт текущий объект обхода.&lt;/p&gt;

&lt;p&gt;А теперь самое интересное, необходимо реализовать некоторый конечный репозиторий иерархических данных.&lt;/p&gt;

&lt;h4&gt;Реализация IHierarchyDataRepository&lt;/h4&gt;

&lt;p&gt;Так как настоящий слой данных обычно реализуется независимо от тех всяческих UI-биндингов, то мы будем представлять что где-то в слое данных уже есть реализованный набор операций доступа к хранилищу объектов.&lt;/p&gt;

&lt;p&gt;Вспоминаем наши первоначальные модели древовидных данных &lt;strong&gt;PlainTreeModel&lt;/strong&gt; и &lt;strong&gt;ORMTreeModel&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Для первой модели, интерфейс должен выглядеть примерно так:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IPlaneTreeModelRepository.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Collections&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IPlainTreeModelRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetRoots();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetItems(&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; parentID);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T GetItem(&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; id);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Но в этом примере я не буду использовать интерфейсы, а лучше воспользуюсь возможностями языка C# и представлю данный интерфейс в виде набора независимых функций высшего порядка.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: В качестве основных полей объекта предполагается существование полей &amp;quot;ID&amp;quot; и &amp;quot;ParentID&amp;quot;, если их в объекте не окажется, то возникнет ошибка времени выполнения.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PlainTreeModelRepository.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Collections&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;PlainTreeModelRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;where&lt;/span&gt; T : &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; getItemsById;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;, T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; getItemByIdImpl;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; PlainTreeModelRepository(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IPlainTreeModelRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; repository)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; :&lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;(repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetRoots, repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetItems, repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetItem)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; PlainTreeModelRepository(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl,&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; getItemsById,&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;, T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; getItemByIdImpl)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;getRootsImpl &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;getItemsById &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; getItemsById;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;getItemByIdImpl &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; getItemByIdImpl;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; T GetItem(&lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; path)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; pathItems &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; path&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Split(&lt;span style=&quot;color: #a31515&quot;&gt;&#39;/&#39;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (pathItems&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Length &lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;0&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; itemID &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Parse(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pathItems[pathItems&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Length &lt;span style=&quot;color: purple&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;1&lt;/span&gt;]);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; getItemByIdImpl(itemID);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetChildren(T item)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (item &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; getRootsImpl();&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; getItemsById(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetProperty&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; T GetParent(T item)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (item &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ArgumentNullException&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; parentID &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; item&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetProperty&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;ParentID&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; getItemByIdImpl(parentID);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; GetItemHierarchyPath(&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; parentHierarchyPath, T item)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (parentHierarchyPath &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ArgumentNullException&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;parentHierarchyPath&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (item &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ArgumentNullException&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Format(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;{0}/{1}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parentHierarchyPath,&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetProperty&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; GetItemType(T item)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (item &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ArgumentNullException&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;typeof&lt;/span&gt;(T)&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ToString();&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Для составления пути внутри иерархической структуры используется нотация в виде /RootID/…/ParentID/ItemID/ChildID. В качестве типа объектов используется CLR-тип этого объекта.&lt;/p&gt;

&lt;p&gt;Поля объектов извлекаются с помощью рефлексии (точнее TypeDescriptor&#39;а) и следующего хелпера:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeDescriptorExtensions.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ComponentModel;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;TypeDescriptorExtensions&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;static&lt;/span&gt; TResult GetProperty&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;TResult&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt; item,&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; propName)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; properties &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;TypeDescriptor&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetProperties(item);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; descriptor &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; properties&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Find(propName, &lt;span style=&quot;color: blue&quot;&gt;true&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (descriptor &lt;span style=&quot;color: purple&quot;&gt;!=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: purple&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; descriptor&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;PropertyType &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;typeof&lt;/span&gt;(TResult))&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; (TResult)descriptor&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetValue(item);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;InvalidOperationException&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Format(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;Property &#39;{0}&#39; with type &#39;{1}&#39; not found.&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propName, &lt;span style=&quot;color: blue&quot;&gt;typeof&lt;/span&gt;(TResult)));&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Аналогичным образом реализуем модель характерную для ORM.&lt;/p&gt;

&lt;p&gt;Интерфейс хранилища объектов, который нам понадобится будет выглядеть так:&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Collections&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IORMTreeModelRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetRoots();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T GetItem(&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; parentID);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Но опять же, использовать данный интерфейс мы не станем, а обойдёмся фукнциями высшего порядка в параметрах конструктора.&lt;/p&gt;

&lt;p&gt;Путь в иерархической структуре строится аналогично предыдущей модели.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: В качестве основных полей объекта предполагается существование полей &amp;quot;ID&amp;quot;, &amp;quot;Parent&amp;quot; и &amp;quot;Children&amp;quot;, если их в объекте не окажется, то возникнет ошибка времени выполнения.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ORMTreeModelRepository.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Collections&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ORMTreeModelRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style=&quot;color: #2b91af&quot;&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;where&lt;/span&gt; T : &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;, T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; getItemByIdImpl;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; ORMTreeModelRepository(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;IORMTreeModelRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; repository)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;(repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetRoots, repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetItem)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; ORMTreeModelRepository(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl,&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #2b91af&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;, T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; getItemImpl)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;getRootsImpl &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;getItemByIdImpl &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; getItemImpl;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; T GetItem(&lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; path)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; pathItems &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; path&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Split(&lt;span style=&quot;color: #a31515&quot;&gt;&#39;/&#39;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (pathItems&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Length &lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;0&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; itemID &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Parse(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pathItems[pathItems&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Length &lt;span style=&quot;color: purple&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;1&lt;/span&gt;]);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; getItemByIdImpl(itemID);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetChildren(T item)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (item &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; getRootsImpl();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; item&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetProperty&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;Children&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; T GetParent(T item)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (item &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ArgumentNullException&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; item&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetProperty&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;Parent&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; GetItemHierarchyPath(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; parentHierarchyPath, T item)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (parentHierarchyPath &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ArgumentNullException&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;parentHierarchyPath&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (item &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ArgumentNullException&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Format(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;{0}/{1}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parentHierarchyPath,&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetProperty&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; GetItemType(T item)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;if&lt;/span&gt; (item &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ArgumentNullException&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;typeof&lt;/span&gt;(T)&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ToString();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Для более типизированного использования потребуется реализовать интерфейс иерархического репозитория для конкретного типа или ввести интерфейс, который должны будут поддерживать объекты из иерархического хранилища.&lt;/p&gt;

&lt;h4&gt;Пример использования&lt;/h4&gt;

&lt;p&gt;Предположим, что у нас есть база данных, которая содержит в себе иерархическую структуру отделов некоторой организации.&lt;/p&gt;

&lt;p&gt;Для доступа к этой БД будем использовать Entity Framework, модель будет выглядеть следующим образом:&lt;/p&gt;

&lt;p&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Скриншот: Departments на диаграмме модели Entity Framework&quot; border=&quot;0&quot; alt=&quot;Скриншот: Departments на диаграмме модели Entity Framework&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqFBYsa8AAL6clgAvwFADJR2VdFpNgvzx5XgLoeHwWr4pvbe1rZyBANQ_9At4RJc4g__zOni7zzUjRrcY4dzCG4GQUoFbtevWEQma2s3lol48XKY5T8dsx5tdSJwHbYF8p-0_H1_7RwzU/?imgmax=800&quot; width=&quot;502&quot; height=&quot;498&quot; /&gt; &lt;/p&gt;

&lt;p&gt;Реализуем слой данных для доступа к данным в этой таблице:&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Collections&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Linq;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Code&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;DataLayer&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;DepartmentRepository&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;Department&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetDepartments()&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; context &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchicalDbEntities&lt;/span&gt;())&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; query &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;from&lt;/span&gt; d &lt;span style=&quot;color: blue&quot;&gt;in&lt;/span&gt; context&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;DepartmentSet&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;where&lt;/span&gt; &lt;span style=&quot;color: purple&quot;&gt;!&lt;/span&gt;d&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ParentID&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;HasValue&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;select&lt;/span&gt; d;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; query&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;IEnumerable&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;Department&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt; GetDepartments(&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; parentID)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; context &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchicalDbEntities&lt;/span&gt;())&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; query &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;from&lt;/span&gt; d &lt;span style=&quot;color: blue&quot;&gt;in&lt;/span&gt; context&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;DepartmentSet&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;where&lt;/span&gt; d&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ParentID&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;HasValue &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: purple&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; d&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ParentID&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Value &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; parentID&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;select&lt;/span&gt; d;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; query&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;Department&lt;/span&gt; GetDepartment(&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; id)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; context &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;HierarchicalDbEntities&lt;/span&gt;())&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; query &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;from&lt;/span&gt; d &lt;span style=&quot;color: blue&quot;&gt;in&lt;/span&gt; context&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;DepartmentSet&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;where&lt;/span&gt; d&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ID &lt;span style=&quot;color: purple&quot;&gt;==&lt;/span&gt; id&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;select&lt;/span&gt; d;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; query&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;First();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Сделаем страничку, на которой будем отображать организационную структуру:&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;background: #ffee62&quot;&gt;&amp;lt;%&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;@&lt;/span&gt; &lt;span style=&quot;color: #a31515&quot;&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;Language&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;MasterPageFile&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;AutoEventWireup&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;CodeBehind&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;TreeViewWithRepository.aspx.cs&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: red&quot;&gt;Inherits&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Home.Andir.Examples.TreeViewWithRepositoryPage&amp;quot;&lt;/span&gt; &lt;span style=&quot;background: #ffee62&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Content&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeView&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataBindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeNodeBinding&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;ValueField&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;ID&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;TextField&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;DataBindings&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;TreeView&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;Content&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;и теперь в CodeBehind реализуем биндинг данных к &lt;strong&gt;DepartmentRepository&lt;/strong&gt;:&lt;/p&gt;

&lt;div style=&quot;font-family: courier new; background: white; color: black; font-size: 10pt&quot;&gt;
  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Code&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;DataLayer;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; Home&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Andir&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;{&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;partial&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;TreeViewWithRepositoryPage&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : System&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;Web&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;UI&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;void&lt;/span&gt; Page_Load(&lt;span style=&quot;color: blue&quot;&gt;object&lt;/span&gt; sender, &lt;span style=&quot;color: #2b91af&quot;&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;var&lt;/span&gt; repository &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;DepartmentRepository&lt;/span&gt;();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; treeView&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;DataSource &lt;span style=&quot;color: purple&quot;&gt;=&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;GenericHierarchicalDataSource&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;Department&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;PlainTreeModelRepository&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;Department&lt;/span&gt;&lt;span style=&quot;color: purple&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; () &lt;span style=&quot;color: purple&quot;&gt;=&amp;gt;&lt;/span&gt; repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetDepartments(),&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item &lt;span style=&quot;color: purple&quot;&gt;=&amp;gt;&lt;/span&gt; repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetDepartments(item&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;ID),&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; id &lt;span style=&quot;color: purple&quot;&gt;=&amp;gt;&lt;/span&gt; repository&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;GetDepartment(id)));&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; treeView&lt;span style=&quot;color: purple&quot;&gt;.&lt;/span&gt;DataBind();&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style=&quot;margin: 0px&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Для проверки запускаем:&lt;/p&gt;

&lt;p&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Скриншот: Результат выполнения TreeViewWithRepository&quot; border=&quot;0&quot; alt=&quot;Скриншот: Результат выполнения TreeViewWithRepository&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl_gJ8sYKMtyLO_xfYeUCLUWhn2vtVbn218D5WcqE5aTUJ-axUfLimog6inkqqQiMIyFwNHdutuyml9SrBgIKUCDsNP_9K7dxh9-hO7FAZ7jyz0DyHeHoIgCs4_K5m_6psV6IWH7bnEpM/?imgmax=800&quot; width=&quot;472&quot; height=&quot;362&quot; /&gt; &lt;/p&gt;

&lt;p&gt;Вот, наконец-то, всё заработало :-)&lt;/p&gt;

&lt;p&gt;Полный проект с реализацией IHierarchicalDataSource можно взять &lt;a href=&quot;http://sites.google.com/site/andirnotes/blogfiles/HierarchicalDataSource.zip&quot;&gt;здесь&lt;/a&gt;.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://andir-notes.blogspot.com/feeds/5727684102915237804/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://andir-notes.blogspot.com/2009/09/ihierarchicaldatasource-generic.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default/5727684102915237804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default/5727684102915237804'/><link rel='alternate' type='text/html' href='http://andir-notes.blogspot.com/2009/09/ihierarchicaldatasource-generic.html' title='Реализация обобщённого варианта IHierarchicalDataSource'/><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6eNBI3or8fj8zA79NTmPyJd9Vj-p5oEJNjyWrYQmqdWxDG0ITEXNPZnxXaDdAqpsEgUqMv2PQtLFYulwXR3dss9TRd8Ib8S8MscEIjBypNWG43oHEi9qddK4c6svSUZ57xLevR_UuaDE/s72-c?imgmax=800" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7550093075906678978.post-2690547713266031153</id><published>2009-08-25T17:36:00.001+04:00</published><updated>2009-08-27T19:47:37.773+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="prolog"/><title type='text'>Пролог: Изучение с нуля</title><content type='html'>&lt;p&gt;Добрался таки до пролога. Чтобы не потерять, все источники собираю в одном месте.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Реализации&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://www.swi-prolog.org/&quot;&gt;SWI-Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href=&quot;http://www.gprolog.org/&quot;&gt;GNU Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href=&quot;http://www.probp.com/&quot;&gt;B Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href=&quot;http://www.sics.se/isl/sicstuswww/site/index.html&quot;&gt;SICStus Prolog&lt;/a&gt; (платный, 30 дневный trial выдаётся по запросу),  &lt;li&gt;&lt;a href=&quot;http://www.dobrev.com/&quot;&gt;Strawberry Prolog&lt;/a&gt; (Light версия распространяется бесплатно).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Редакторы кода&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;PceEmacs (встроенный Emacs для SWI-Prolog),  &lt;li&gt;&lt;a href=&quot;http://www.gnu.org/software/emacs/&quot;&gt;Emacs&lt;/a&gt; (&lt;a href=&quot;http://www.swi-prolog.org/FAQ/GnuEmacs.html&quot;&gt;prolog-mode&lt;/a&gt;),  &lt;li&gt;&lt;a href=&quot;http://www.visual-prolog.com/&quot;&gt;Visual Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href=&quot;http://sewiki.iai.uni-bonn.de/research/pdt/start&quot;&gt;Prolog Development Tool for Eclipse&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Источники первичной информации&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Prolog&quot;&gt;Wikipedia: Prolog&lt;/a&gt;, &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Большая статья из которой можно почерпнуть практически всю доступную информацию о языке Prolog.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://en.wikibooks.org/wiki/Prolog&quot;&gt;Wikibooks: Prolog&lt;/a&gt;, &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Очень хорошее начало, но, к сожалению, содержит пропуски в некоторых частях, для полноценного изучения не годится.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Prolog ISO/IEC 13211-1:1995 - стандарт языка, &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; В 1995 году был принят стандарт языка, но к сожалению в свободном доступе его обнаружить не удалось, есть только &lt;a href=&quot;http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/prolog/doc/standard/&quot;&gt;черновик&lt;/a&gt; в PostScript формате.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://pauillac.inria.fr/~deransar/prolog/docs.html&quot;&gt;Prolog: ISO Standard documents&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Набор документов и программ использованных при разработке стандарта языка.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Туториалы&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/intro.html&quot;&gt;Prolog Tutorial&lt;/a&gt;,  &lt;li&gt;&lt;a href=&quot;http://www.kuro5hin.org/print/2004/2/25/124713/784&quot;&gt;A Prolog Introduction for Hackers&lt;/a&gt;, &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Книги&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&quot;Программирование на языке Пролог&quot;, У. Клоксин К. Меллиш (&quot;Programming in Prolog&quot; by W.F. Clocksin and C.S. Mellish),  &lt;li&gt;&lt;a href=&quot;http://www.softcraft.ru/paradigm/dp/index.shtml&quot;&gt;&quot;Декларативное программирование&quot;&lt;/a&gt;, И.А.Дехтяренко,  &lt;li&gt;Программирование на языке Пролог для искусственного интеллекта, И. Братко,  &lt;li&gt;&lt;a href=&quot;http://www.learnprolognow.org&quot;&gt;Learn Prolog Now&lt;/a&gt; by Patrick Blackburn, Johan Bos and Kristina Striegnitz&amp;nbsp; (&lt;a href=&quot;http://cs.union.edu/~striegnk/learn-prolog-now/html/index.html&quot;&gt;бесплатная онлайн-версия&lt;/a&gt;). &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Задачи&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;https://prof.ti.bfh.ch/hew1/informatik3/prolog/p-99/&quot;&gt;99 Prolog problems&lt;/a&gt;,&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Другое&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://personnel.univ-reunion.fr/fred/Enseignement/Prolog/freestuff.html&quot;&gt;Free stuff for programming in Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href=&quot;http://www.cse.unsw.edu.au/~billw/prologdict.html&quot;&gt;The Prolog Dictionary&lt;/a&gt;,  &lt;li&gt;&lt;a href=&quot;http://www.cs.mu.oz.au/~lee/papers/ho/&quot;&gt;Higher-order logic programming in Prolog&lt;/a&gt; (статья о программировании с правилами высшего порядка, сама статья в pdf лежит &lt;a href=&quot;http://www.cs.umbc.edu/771/papers/mu_96_02.pdf&quot;&gt;отдельно&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;Очень краткое введение&lt;/h4&gt; &lt;p&gt;Пролог – это декларативный логический язык программирования. Основными его конструкциями являются логические предложения (например: human(&#39;Socrat&#39;) :- true.), на основании которых пролог строит некоторые логические выводы. Предложения объединяются в правила с помощью операции and, которая обозначается знаком &#39;,&#39;. Предложение при проверке может создавать побочные эффекты, что используется для ввода/вывода.&lt;/p&gt; &lt;h4&gt;Краткий путеводитель по синтаксису&lt;/h4&gt;&lt;pre style=&quot;background-color: #ffffff; font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;﻿&lt;span style=&quot;color: #006633&quot;&gt;% Это строчный комментарий&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt;/* А это блочный комментарий */&lt;/span&gt;

&lt;span style=&quot;color: #d11ced&quot;&gt;goal&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;(&lt;/span&gt;X&lt;span style=&quot;color: #555555&quot;&gt;,&lt;/span&gt; Y&lt;span style=&quot;color: #555555&quot;&gt;) :-&lt;/span&gt;   &lt;span style=&quot;color: #006633&quot;&gt;% goal - это цель, для которой мы собираем правила,&lt;/span&gt;
                &lt;span style=&quot;color: #006633&quot;&gt;% имя цели всегда начинается с маленькой буквы.&lt;/span&gt;
                &lt;span style=&quot;color: #006633&quot;&gt;% результат у цели - это всегда true или false.&lt;/span&gt;
                &lt;span style=&quot;color: #006633&quot;&gt;% X, Y - параметры цели.&lt;/span&gt;

    X &lt;span style=&quot;color: #555555&quot;&gt;&amp;gt;&lt;/span&gt; Y       &lt;span style=&quot;color: #006633&quot;&gt;% Первое утверждение, которое утверждает что X больше Y.&lt;/span&gt;

    &lt;span style=&quot;color: #555555&quot;&gt;,&lt;/span&gt;           &lt;span style=&quot;color: #006633&quot;&gt;% Разделитель между утверждениями, означает логическое И.&lt;/span&gt;

    X &lt;span style=&quot;color: #555555&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: #32ba06&quot;&gt;1&lt;/span&gt; &lt;span style=&quot;color: #555555&quot;&gt;==&lt;/span&gt; Y  &lt;span style=&quot;color: #006633&quot;&gt;% Второе утверждение, которое может быть верным,&lt;/span&gt;
                &lt;span style=&quot;color: #006633&quot;&gt;% только если Y = X + 1.&lt;/span&gt;

    &lt;span style=&quot;color: #555555&quot;&gt;.&lt;/span&gt;           &lt;span style=&quot;color: #006633&quot;&gt;% Точка означает конец описания цели.&lt;/span&gt;

&lt;span style=&quot;color: #006633&quot;&gt;/*&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt; * Суммирую:&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt; * Имя цели всегда с маленькой буквы,&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt; * Параметры цели, и все другие переменные с большой буквы,&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt; * Утверждения разделяются запятой,&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt; * Описание цели всегда заканчивается точкой.&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt; */&lt;/span&gt;

&lt;span style=&quot;color: #d11ced&quot;&gt;prolog&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1861a7&quot;&gt;&#39;logic language&#39;&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;).&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt;% Так записываются некоторые факты,&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt;% и по сути являются сокращениями для цели,&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt;% которая всегда возвращает true.&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt;% в данном случае эквивалент выглядел бы так:&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt;% prolog(&#39;logic language&#39;) :- true.&lt;/span&gt;

&lt;span style=&quot;color: #006633&quot;&gt;% Цели могут быть рекурсивными.&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt;% Посчитаем сумму от 0 до X.&lt;/span&gt;
&lt;span style=&quot;color: #d11ced&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #32ba06&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #32ba06&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;).&lt;/span&gt;   &lt;span style=&quot;color: #006633&quot;&gt;% факт используется для остановки рекурсии.&lt;/span&gt;
&lt;span style=&quot;color: #d11ced&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;(&lt;/span&gt;X&lt;span style=&quot;color: #555555&quot;&gt;,&lt;/span&gt; Result&lt;span style=&quot;color: #555555&quot;&gt;) :-&lt;/span&gt;
    Y &lt;span style=&quot;color: #ff3030&quot;&gt;is&lt;/span&gt; X &lt;span style=&quot;color: #555555&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;color: #32ba06&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;,&lt;/span&gt;             &lt;span style=&quot;color: #006633&quot;&gt;% is - это по сути присвоение значения.&lt;/span&gt;
    &lt;span style=&quot;color: #d11ced&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;(&lt;/span&gt;Y&lt;span style=&quot;color: #555555&quot;&gt;,&lt;/span&gt; SubResult&lt;span style=&quot;color: #555555&quot;&gt;),&lt;/span&gt;      &lt;span style=&quot;color: #006633&quot;&gt;% Рекурсивный вызов.&lt;/span&gt;
    Result &lt;span style=&quot;color: #ff3030&quot;&gt;is&lt;/span&gt; X &lt;span style=&quot;color: #555555&quot;&gt;+&lt;/span&gt; SubResult&lt;span style=&quot;color: #555555&quot;&gt;.&lt;/span&gt;


&lt;span style=&quot;color: #006633&quot;&gt;% Цель, которая будет использоваться при запуске программы,&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt;% имя &#39;main&#39; выбрано мною произвольно.&lt;/span&gt;
main &lt;span style=&quot;color: #555555&quot;&gt;:-&lt;/span&gt;
    &lt;span style=&quot;color: #006633&quot;&gt;% запрашиваем значение факта&lt;/span&gt;
    &lt;span style=&quot;color: #d11ced&quot;&gt;prolog&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;(&lt;/span&gt;Which&lt;span style=&quot;color: #555555&quot;&gt;),&lt;/span&gt;
    &lt;span style=&quot;color: #006633&quot;&gt;% выводим значение на экран&lt;/span&gt;
    &lt;span style=&quot;color: #d11ced&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1861a7&quot;&gt;&#39;prolog is a ~a.&#39;&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;, [&lt;/span&gt;Which&lt;span style=&quot;color: #555555&quot;&gt;]),&lt;/span&gt;

    &lt;span style=&quot;color: #006633&quot;&gt;% newline&lt;/span&gt;
    &lt;span style=&quot;color: #ff3030&quot;&gt;nl&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;,&lt;/span&gt;

    &lt;span style=&quot;color: #006633&quot;&gt;% задаём значение X&lt;/span&gt;
    X &lt;span style=&quot;color: #ff3030&quot;&gt;is&lt;/span&gt; &lt;span style=&quot;color: #32ba06&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;,&lt;/span&gt;
    &lt;span style=&quot;color: #006633&quot;&gt;% считаем сумму от 0 до 100&lt;/span&gt;
    &lt;span style=&quot;color: #d11ced&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;(&lt;/span&gt;X&lt;span style=&quot;color: #555555&quot;&gt;,&lt;/span&gt; Result&lt;span style=&quot;color: #555555&quot;&gt;),&lt;/span&gt;
    &lt;span style=&quot;color: #006633&quot;&gt;% выводим результат с помощью printf-like функции&lt;/span&gt;
    &lt;span style=&quot;color: #d11ced&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1861a7&quot;&gt;&#39;sum(0, ~a) = ~a.&#39;&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;, [&lt;/span&gt;X&lt;span style=&quot;color: #555555&quot;&gt;,&lt;/span&gt; Result&lt;span style=&quot;color: #555555&quot;&gt;]),&lt;/span&gt;

    &lt;span style=&quot;color: #006633&quot;&gt;% newline.&lt;/span&gt;
    &lt;span style=&quot;color: #ff3030&quot;&gt;nl&lt;/span&gt;&lt;span style=&quot;color: #555555&quot;&gt;.&lt;/span&gt;

&lt;span style=&quot;color: #006633&quot;&gt;/*&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt; * Вывод программы при запуске:&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt; * prolog is a logic language.&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt; * sum(0, 100) = 5050.&lt;/span&gt;
&lt;span style=&quot;color: #006633&quot;&gt; */&lt;/span&gt;
&lt;/pre&gt;
&lt;h4&gt;Типы данных&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Атом&lt;/strong&gt;: атом или &#39;атом&#39;, начинается с маленькой буквы или обрамляется одинарными кавычками.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Строка&lt;/strong&gt;: &quot;Строка&quot;, обрамляется двойными кавычками, по факту представляет список из чисел – кодов ASCII символов строки.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Число&lt;/strong&gt;: 10, целые (-1,0,1), плавающая запятая (0.123, 123.456).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Список&lt;/strong&gt;: [0, 1, 2], набор элементов перечисленных через запятую и обрамлённых квадратными скобками. Элементы могут быть разнородными (разных типов). Списки можно деструктурировать через синтаксис [Head | Tail].&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Первые результаты&lt;/h4&gt;
&lt;p&gt;Теперь, с помощью новоприобретённых знаний, можно написать несколько известных примеров:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HelloWorld.pro&lt;/strong&gt;:&lt;/p&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 12px 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;background-color: #ffffff; font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;main &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;:-&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;writeln&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #1861a7; font-size: 11pt&quot;&gt;&#39;Hello, Prolog World!&#39;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt; &lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Factorial.pro&lt;/strong&gt;:&lt;/p&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 12px 0px 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #006633; font-size: 11pt&quot;&gt;% factorial implementation&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;factorial&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;factorial&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    X &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    X1 &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #ff3030; font-size: 11pt&quot;&gt;is&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; X &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;factorial&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;X1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    Result &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #ff3030; font-size: 11pt&quot;&gt;is&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; X &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty&quot;&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;main &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;:-&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;factorial&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; X&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;writeln&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt; &lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0&quot;&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0&quot;&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Fibonachi.pro&lt;/strong&gt;:&lt;/p&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 12px 0px 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #006633; font-size: 11pt&quot;&gt;% Fibbonachi sequence implementation&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;fib&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;fib&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;fib&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    X1 &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #ff3030; font-size: 11pt&quot;&gt;is&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; X &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    X2 &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #ff3030; font-size: 11pt&quot;&gt;is&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; X &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;fib&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;X1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;fib&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;X2&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result2&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    Result &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #ff3030; font-size: 11pt&quot;&gt;is&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result1 &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result2&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty&quot;&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;main &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;:-&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;fib&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; X&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;writeln&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt; &lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0&quot;&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0&quot;&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QuickSort.pro:&lt;/strong&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 12px 0px 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;qsort&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;([], []).&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;qsort&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;], [&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;]).&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;qsort&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Head &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Tail&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;partition&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Head&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Tail&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Left&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Right&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;qsort&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Left&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; LeftSorted&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;qsort&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Right&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; RightSorted&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;LeftSorted&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;, [&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Head &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; RightSorted&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty&quot;&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;partition&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;_&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;, [], [], []).&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;partition&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Pivot&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;, [&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Head &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Tail&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;], [&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Head &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Left&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Right&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    Head &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;=&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Pivot&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;partition&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Pivot&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Tail&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Left&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Right&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;partition&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Pivot&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;, [&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Head &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Tail&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Left&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;, [&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Head &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Right&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;]) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    Head &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Pivot&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;partition&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Pivot&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Tail&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Left&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Right&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty&quot;&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;([],&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Right&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Right&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Head &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Left&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Right&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;, [&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Head &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;]) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;Left&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Right&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty&quot;&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;main &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;:-&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;qsort&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #32ba06; font-size: 11pt&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt; X&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0&quot;&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #d11ced; font-size: 11pt&quot;&gt;writeln&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #330066; font-size: 11pt&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Consolas&#39;; color: #555555; font-size: 11pt&quot;&gt;).&lt;/span&gt; &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Какие ещё есть логические языки программирования?&lt;/h4&gt;
&lt;p&gt;Путём &lt;a href=&quot;http://google.com/search?q=programming+logical+language&quot;&gt;нехитрых&lt;/a&gt; поисков в источниках близким к прологу собрал такой список:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.curry-language.org/&quot;&gt;Curry Language&lt;/a&gt;, &quot;A Truly Integrated Functional Logic Language&quot;:&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Расширение языка Haskell для реализации логического программирования.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cs.mu.oz.au/research/mercury/index.html&quot;&gt;Mercury Project&lt;/a&gt;, &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mercury is a new logic/functional programming language, which combines the clarity and expressiveness of declarative programming with advanced static analysis and error detection features. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mozart-oz.org/&quot;&gt;Oz Language&lt;/a&gt;, &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Мультипарадигменный язык, который включает в себя подмножество логического программирования.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.informatik.uni-kiel.de/~mh/systems/ALF.html&quot;&gt;ALF – Algebraic logical functional language&lt;/a&gt;,&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Язык, комбинирующий функциональное и логическое программирование. По описанию сильно похоже, что к базе логического программирования добавлены функциональные возможности (функции, операторы, типы, структуры и т.п.).&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://andir-notes.blogspot.com/feeds/2690547713266031153/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://andir-notes.blogspot.com/2009/08/prolog-getting-started.html#comment-form' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default/2690547713266031153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7550093075906678978/posts/default/2690547713266031153'/><link rel='alternate' type='text/html' href='http://andir-notes.blogspot.com/2009/08/prolog-getting-started.html' title='Пролог: Изучение с нуля'/><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry></feed>