<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;DU8ARH84eSp7ImA9WxNUGEk.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978</id><updated>2009-11-10T20:10:45.131+10:00</updated><title>Заметки на полях</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="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&amp;v=2" /><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>5</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/AndirNotes" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;A0YERnYzeip7ImA9WxNRGE4.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978.post-1240888670713938885</id><published>2009-09-13T21:49:00.001+11:00</published><updated>2009-09-13T21:51:47.882+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-13T21:51:47.882+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><title>Пример декларативного биндинга asp:TreeView</title><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Рассмотрим пример биндинга asp:TreeView к XmlDataSource.&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;pre style="margin: 0px"&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt; &lt;span style="color: #a31515"&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;CodeBehind&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;TreeView.aspx.cs&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Home.Andir.Examples.TreeViewPage&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt; &lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;DataSourceID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;xmlDataSource&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;span style="color: red"&gt;TextField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;xmlDataSource&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Data&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Root&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Root&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 1&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 2&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 3&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 3.1&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Root&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Data&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&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="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Результат выполнения декларативного биндинга к XmlDataSource" border="0" alt="Скриншот: Результат выполнения декларативного биндинга к XmlDataSource" src="http://lh6.ggpht.com/_cqKDpMpIE24/SqzOPIdp7vI/AAAAAAAAAqA/pUz2BsShnS8/treeview_with_xmldatasource4.png?imgmax=800" width="449" height="334" /&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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt; &lt;span style="color: #a31515"&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;CodeBehind&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;TreeView.aspx.cs&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Home.Andir.Examples.TreeViewPage&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt; &lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;DataSourceID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;feedDataSource&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;DataMember&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;feed&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;FormatString&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Блог: {0}&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;TextField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;title&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;DataMember&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;entry&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;FormatString&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Запись: {0}&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;TextField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;title&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;NavigateUrlField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;url&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;feedDataSource&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Transform&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml&lt;/span&gt; &lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;encoding&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;stylesheet&lt;/span&gt; &lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: #a31515"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: #a31515"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;atom&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;http://www.w3.org/2005/Atom&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;exclude-result-prefixes&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;atom&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;template&lt;/span&gt; &lt;span style="color: red"&gt;match&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;atom:feed&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;feed&lt;/span&gt; &lt;span style="color: red"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{atom:title}&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;apply-templates&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;feed&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;template&lt;/span&gt; &lt;span style="color: red"&gt;match&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;atom:entry&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;entry&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{atom:title}&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;url&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{atom:link[@rel='alternate']/@href}&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;apply-templates&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;entry&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;stylesheet&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Transform&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;и немного кода:&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Net;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Text;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;partial&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TreeViewPage&lt;/span&gt; : System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI&lt;span style="color: purple"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; rssFeedUrl &lt;span style="color: purple"&gt;=&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: #a31515"&gt;&amp;quot;http://feeds2.feedburner.com/AndirNotes&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: purple"&gt;.&lt;/span&gt;Data &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; DownloadRssFeed(&lt;span style="color: blue"&gt;string&lt;/span&gt; url)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; client &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WebClient&lt;/span&gt;();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; resultBytes &lt;span style="color: purple"&gt;=&lt;/span&gt; client&lt;span style="color: purple"&gt;.&lt;/span&gt;DownloadData(url);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;UTF8&lt;span style="color: purple"&gt;.&lt;/span&gt;GetString(resultBytes);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Результат выполнения биндинга к моему RSS" border="0" alt="Скриншот: Результат выполнения биндинга к моему RSS" src="http://lh6.ggpht.com/_cqKDpMpIE24/SqzORgMbUeI/AAAAAAAAAqE/QzSc6DOsLqE/treeview_with_xmldatasource_feed4.png?imgmax=800" width="531" height="312" /&gt;&lt;/p&gt;

&lt;p&gt;В этом случае всё очень просто, однако для более изощрённых истоников иерархических данных может понадобится собственная реализация IHierarchicalDataSource. Вопросы реализации этого интерфейса рассматриваются в заметке: &lt;a href="http://andir-notes.blogspot.com/2009/09/ihierarchicaldatasource-generic.html"&gt;Реализация обобщённого варианта IHierarchicalDataSource&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7550093075906678978-1240888670713938885?l=andir-notes.blogspot.com'/&gt;&lt;/div&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="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/1240888670713938885?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/1240888670713938885?v=2" /><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:extendedProperty name="OpenSocialUserId" value="05140528043797926954" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0UHSXY-cCp7ImA9WxNRGE4.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978.post-5727684102915237804</id><published>2009-09-13T21:30:00.001+11:00</published><updated>2009-09-13T21:53:58.858+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-13T21:53:58.858+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="advanced" /><title>Реализация обобщённого варианта 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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;pre style="margin: 0px"&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt; &lt;span style="color: #a31515"&gt;Page&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="background: #ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt; &lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;DataSourceID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;xmlDataSource&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;DataMember&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Root&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Root&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;DataMember&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: red"&gt;TextField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;xmlDataSource&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Data&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Root&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 1&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 2&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 2.1&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 2.2&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 1&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Root&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Data&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Примечание: Более подробный пример использования биндинга asp:TreeView к XmlDataSource можно посмотреть в следующей &lt;a href="http://andir-notes.blogspot.com/2009/09/asptreeview-decrarative-binding.html"&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="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Таблица в базе данных с типичной древовидной структурой" border="0" alt="Скриншот: Таблица в базе данных с типичной древовидной структурой" src="http://lh5.ggpht.com/_cqKDpMpIE24/SqzJIBBQBLI/AAAAAAAAApo/40aKrAmHrSk/TreeTable4.png?imgmax=800" width="650" height="223" /&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="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Диграмма классов для PlainTreeModel" border="0" alt="Скриншот: Диграмма классов для PlainTreeModel" src="http://lh6.ggpht.com/_cqKDpMpIE24/SqzJJeEMuCI/AAAAAAAAAps/BlKnUT5T0_4/PlainTreeModel4.png?imgmax=800" width="478" height="483" /&gt; &lt;/p&gt;

&lt;p&gt;Второй вариант обычно возникает при использовании продвинутых средств отображения (ORM):&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Диаграмма классов для ORMTreeModel" border="0" alt="Скриншот: Диаграмма классов для ORMTreeModel" src="http://lh6.ggpht.com/_cqKDpMpIE24/SqzJPkafsuI/AAAAAAAAApw/9vS-mFszA80/ORMTreeModel4.png?imgmax=800" width="529" height="503" /&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="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Диаграмма классов для реализации IHierarchicalDataSource" border="0" alt="Скриншот: Диаграмма классов для реализации IHierarchicalDataSource" src="http://lh5.ggpht.com/_cqKDpMpIE24/SqzJWw5dnLI/AAAAAAAAAp0/NtCaod8uQ1k/IHierarchicalDataSource4.png?imgmax=800" width="695" height="547" /&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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetParent();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetChildren();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; T Item { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;GetParent()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; GetParent();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; HasChildren { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IHierarchicalEnumerable&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;GetChildren()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; GetChildren();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;object&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Item&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; Item; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Path { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Type { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;HierarchyEnumerable.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;IHierarchicalEnumerable&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetHierarchyData(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;GetHierarchyData(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;object&lt;/span&gt; enumeratedItem)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; GetHierarchyData((T)enumeratedItem);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerator&lt;/span&gt; GetEnumerator();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
    &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
      &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
        &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

        &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetChildren(T item);&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemType(T item);&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T GetItem(&lt;span style="color: blue"&gt;string&lt;/span&gt; hierarchyPath);&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemHierarchyPath(&lt;/pre&gt;

        &lt;pre style="margin: 0px"&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="color: blue"&gt;string&lt;/span&gt; parentHierarchyPath, T item);&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

        &lt;pre style="margin: 0px"&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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;sealed&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalDataSource&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;IHierarchicalDataSource&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; GenericHierarchicalDataSource(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;repository &lt;span style="color: purple"&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt; DataSourceChanged;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalDataSourceView&lt;/span&gt; GetHierarchicalView(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;string&lt;/span&gt; viewPath)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalDataSourceView&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;sealed&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalDataSourceView&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;HierarchicalDataSourceView&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; viewPath;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; GenericHierarchicalDataSourceView(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository, &lt;span style="color: blue"&gt;string&lt;/span&gt; viewPath)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;repository &lt;span style="color: purple"&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;viewPath &lt;span style="color: purple"&gt;=&lt;/span&gt; viewPath;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchicalEnumerable&lt;/span&gt; Select()&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: purple"&gt;!&lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;IsNullOrEmpty(viewPath))&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; hierarchyItem &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; hierarchyItem&lt;span style="color: purple"&gt;.&lt;/span&gt;GetChildren();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;null&lt;/span&gt;, repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetChildren(&lt;span style="color: blue"&gt;null&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;sealed&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; enumerableList;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; GenericHierarchicalEnumerable(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; parent,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; enumerableList&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;repository &lt;span style="color: purple"&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;parent &lt;span style="color: purple"&gt;=&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;enumerableList &lt;span style="color: purple"&gt;=&lt;/span&gt; enumerableList;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetHierarchyData(T item)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerator&lt;/span&gt; GetEnumerator()&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; enumerableList&lt;span style="color: purple"&gt;.&lt;/span&gt;GetEnumerator();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Linq;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;sealed&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; T item;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IList&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; children;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; path;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; type;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; GenericHierarchyData(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;string&lt;/span&gt; itemPath)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;repository &lt;span style="color: purple"&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;item &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItem(itemPath);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;parent &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;children &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetChildren(item)&lt;span style="color: purple"&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;path &lt;span style="color: purple"&gt;=&lt;/span&gt; itemPath;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;type &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItemType(item);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; GenericHierarchyData(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; parent,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;repository &lt;span style="color: purple"&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;item &lt;span style="color: purple"&gt;=&lt;/span&gt; item;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;parent &lt;span style="color: purple"&gt;=&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;children &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetChildren(item)&lt;span style="color: purple"&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;path &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItemHierarchyPath(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt; &lt;span style="color: purple"&gt;?&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt; : parent&lt;span style="color: purple"&gt;.&lt;/span&gt;Path, item);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;type &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItemType(item);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetParent()&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; HasChildren&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; children&lt;span style="color: purple"&gt;.&lt;/span&gt;Count &lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: red"&gt;0&lt;/span&gt;; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetChildren()&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;, children&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; T Item { &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; item; } }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Path { &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; path; } }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Type { &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; type; } }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IPlainTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetRoots();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetItems(&lt;span style="color: blue"&gt;int&lt;/span&gt; parentID);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T GetItem(&lt;span style="color: blue"&gt;int&lt;/span&gt; id);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PlainTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getItemsById;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; getItemByIdImpl;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; PlainTreeModelRepository(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;IPlainTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;(repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetRoots, repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItems, repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItem)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; PlainTreeModelRepository(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getItemsById,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; getItemByIdImpl)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;getRootsImpl &lt;span style="color: purple"&gt;=&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;getItemsById &lt;span style="color: purple"&gt;=&lt;/span&gt; getItemsById;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;getItemByIdImpl &lt;span style="color: purple"&gt;=&lt;/span&gt; getItemByIdImpl;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; T GetItem(&lt;span style="color: blue"&gt;string&lt;/span&gt; path)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; pathItems &lt;span style="color: purple"&gt;=&lt;/span&gt; path&lt;span style="color: purple"&gt;.&lt;/span&gt;Split(&lt;span style="color: #a31515"&gt;'/'&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (pathItems&lt;span style="color: purple"&gt;.&lt;/span&gt;Length &lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: red"&gt;0&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: blue"&gt;int&lt;/span&gt; itemID &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Parse(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: purple"&gt;.&lt;/span&gt;Length &lt;span style="color: purple"&gt;-&lt;/span&gt; &lt;span style="color: red"&gt;1&lt;/span&gt;]);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; getItemByIdImpl(itemID);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetChildren(T item)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; getRootsImpl();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; getItemsById(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; T GetParent(T item)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; parentID &lt;span style="color: purple"&gt;=&lt;/span&gt; item&lt;span style="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ParentID&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; getItemByIdImpl(parentID);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemHierarchyPath(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;string&lt;/span&gt; parentHierarchyPath, T item)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (parentHierarchyPath &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;parentHierarchyPath&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0}/{1}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemType(T item)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(T)&lt;span style="color: purple"&gt;.&lt;/span&gt;ToString();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&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'а) и следующего хелпера:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeDescriptorExtensions.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;ComponentModel;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TypeDescriptorExtensions&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; TResult GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;TResult&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt; item,&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;string&lt;/span&gt; propName)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; properties &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TypeDescriptor&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;GetProperties(item);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; descriptor &lt;span style="color: purple"&gt;=&lt;/span&gt; properties&lt;span style="color: purple"&gt;.&lt;/span&gt;Find(propName, &lt;span style="color: blue"&gt;true&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (descriptor &lt;span style="color: purple"&gt;!=&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: purple"&gt;&amp;amp;&amp;amp;&lt;/span&gt; descriptor&lt;span style="color: purple"&gt;.&lt;/span&gt;PropertyType &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(TResult))&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; (TResult)descriptor&lt;span style="color: purple"&gt;.&lt;/span&gt;GetValue(item);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: blue"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;String&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Format(&lt;span style="color: #a31515"&gt;&amp;quot;Property '{0}' with type '{1}' not found.&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;typeof&lt;/span&gt;(TResult)));&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Аналогичным образом реализуем модель характерную для ORM.&lt;/p&gt;

&lt;p&gt;Интерфейс хранилища объектов, который нам понадобится будет выглядеть так:&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IORMTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetRoots();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T GetItem(&lt;span style="color: blue"&gt;int&lt;/span&gt; parentID);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ORMTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; getItemByIdImpl;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; ORMTreeModelRepository(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;IORMTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;(repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetRoots, repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItem)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; ORMTreeModelRepository(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl,&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; getItemImpl)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;getRootsImpl &lt;span style="color: purple"&gt;=&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;getItemByIdImpl &lt;span style="color: purple"&gt;=&lt;/span&gt; getItemImpl;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; T GetItem(&lt;span style="color: blue"&gt;string&lt;/span&gt; path)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; pathItems &lt;span style="color: purple"&gt;=&lt;/span&gt; path&lt;span style="color: purple"&gt;.&lt;/span&gt;Split(&lt;span style="color: #a31515"&gt;'/'&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (pathItems&lt;span style="color: purple"&gt;.&lt;/span&gt;Length &lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: red"&gt;0&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: blue"&gt;int&lt;/span&gt; itemID &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Parse(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: purple"&gt;.&lt;/span&gt;Length &lt;span style="color: purple"&gt;-&lt;/span&gt; &lt;span style="color: red"&gt;1&lt;/span&gt;]);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; getItemByIdImpl(itemID);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetChildren(T item)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; getRootsImpl();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; item&lt;span style="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Children&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; T GetParent(T item)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; item&lt;span style="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Parent&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemHierarchyPath(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;string&lt;/span&gt; parentHierarchyPath, T item)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (parentHierarchyPath &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;parentHierarchyPath&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0}/{1}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemType(T item)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(T)&lt;span style="color: purple"&gt;.&lt;/span&gt;ToString();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Departments на диаграмме модели Entity Framework" border="0" alt="Скриншот: Departments на диаграмме модели Entity Framework" src="http://lh3.ggpht.com/_cqKDpMpIE24/SqzJY6ATq1I/AAAAAAAAAp4/wPaQ_Dul1ZQ/EntityFramework_DepartmentModel4.png?imgmax=800" width="502" height="498" /&gt; &lt;/p&gt;

&lt;p&gt;Реализуем слой данных для доступа к данным в этой таблице:&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Linq;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;span style="color: purple"&gt;.&lt;/span&gt;Code&lt;span style="color: purple"&gt;.&lt;/span&gt;DataLayer&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DepartmentRepository&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Department&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetDepartments()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; context &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalDbEntities&lt;/span&gt;())&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; query &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;from&lt;/span&gt; d &lt;span style="color: blue"&gt;in&lt;/span&gt; context&lt;span style="color: purple"&gt;.&lt;/span&gt;DepartmentSet&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;where&lt;/span&gt; &lt;span style="color: purple"&gt;!&lt;/span&gt;d&lt;span style="color: purple"&gt;.&lt;/span&gt;ParentID&lt;span style="color: purple"&gt;.&lt;/span&gt;HasValue&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;select&lt;/span&gt; d;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; query&lt;span style="color: purple"&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Department&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetDepartments(&lt;span style="color: blue"&gt;int&lt;/span&gt; parentID)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; context &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalDbEntities&lt;/span&gt;())&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; query &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;from&lt;/span&gt; d &lt;span style="color: blue"&gt;in&lt;/span&gt; context&lt;span style="color: purple"&gt;.&lt;/span&gt;DepartmentSet&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;where&lt;/span&gt; d&lt;span style="color: purple"&gt;.&lt;/span&gt;ParentID&lt;span style="color: purple"&gt;.&lt;/span&gt;HasValue &lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: purple"&gt;&amp;amp;&amp;amp;&lt;/span&gt; d&lt;span style="color: purple"&gt;.&lt;/span&gt;ParentID&lt;span style="color: purple"&gt;.&lt;/span&gt;Value &lt;span style="color: purple"&gt;==&lt;/span&gt; parentID&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;select&lt;/span&gt; d;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; query&lt;span style="color: purple"&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Department&lt;/span&gt; GetDepartment(&lt;span style="color: blue"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; context &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalDbEntities&lt;/span&gt;())&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; query &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;from&lt;/span&gt; d &lt;span style="color: blue"&gt;in&lt;/span&gt; context&lt;span style="color: purple"&gt;.&lt;/span&gt;DepartmentSet&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;where&lt;/span&gt; d&lt;span style="color: purple"&gt;.&lt;/span&gt;ID &lt;span style="color: purple"&gt;==&lt;/span&gt; id&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;select&lt;/span&gt; d;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; query&lt;span style="color: purple"&gt;.&lt;/span&gt;First();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Сделаем страничку, на которой будем отображать организационную структуру:&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt; &lt;span style="color: #a31515"&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;CodeBehind&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;TreeViewWithRepository.aspx.cs&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Home.Andir.Examples.TreeViewWithRepositoryPage&amp;quot;&lt;/span&gt; &lt;span style="background: #ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt; &lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;span style="color: red"&gt;ValueField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;ID&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;TextField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&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="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;span style="color: purple"&gt;.&lt;/span&gt;Code&lt;span style="color: purple"&gt;.&lt;/span&gt;DataLayer;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;partial&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TreeViewWithRepositoryPage&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI&lt;span style="color: purple"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; repository &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DepartmentRepository&lt;/span&gt;();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: purple"&gt;.&lt;/span&gt;DataSource &lt;span style="color: purple"&gt;=&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalDataSource&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Department&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PlainTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Department&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: purple"&gt;=&amp;gt;&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetDepartments(),&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: purple"&gt;=&amp;gt;&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetDepartments(item&lt;span style="color: purple"&gt;.&lt;/span&gt;ID),&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: purple"&gt;=&amp;gt;&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetDepartment(id)));&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: purple"&gt;.&lt;/span&gt;DataBind();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Результат выполнения TreeViewWithRepository" border="0" alt="Скриншот: Результат выполнения TreeViewWithRepository" src="http://lh3.ggpht.com/_cqKDpMpIE24/SqzJn-lLnfI/AAAAAAAAAp8/2KhHvdYbhcM/TreeViewWithRepository4.png?imgmax=800" width="472" height="362" /&gt; &lt;/p&gt;

&lt;p&gt;Вот, наконец-то, всё заработало :-)&lt;/p&gt;

&lt;p&gt;Полный проект с реализацией IHierarchicalDataSource можно взять &lt;a href="http://sites.google.com/site/andirnotes/blogfiles/HierarchicalDataSource.zip"&gt;здесь&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7550093075906678978-5727684102915237804?l=andir-notes.blogspot.com'/&gt;&lt;/div&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="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/5727684102915237804?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/5727684102915237804?v=2" /><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:extendedProperty name="OpenSocialUserId" value="05140528043797926954" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkcBRnk8eyp7ImA9WxNSE0U.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978.post-2690547713266031153</id><published>2009-08-26T00:36:00.001+11:00</published><updated>2009-08-28T02:47:37.773+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-28T02:47:37.773+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="prolog" /><title>Пролог: Изучение с нуля</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="http://www.swi-prolog.org/"&gt;SWI-Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.gprolog.org/"&gt;GNU Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.probp.com/"&gt;B Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.sics.se/isl/sicstuswww/site/index.html"&gt;SICStus Prolog&lt;/a&gt; (платный, 30 дневный trial выдаётся по запросу),  &lt;li&gt;&lt;a href="http://www.dobrev.com/"&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="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; (&lt;a href="http://www.swi-prolog.org/FAQ/GnuEmacs.html"&gt;prolog-mode&lt;/a&gt;),  &lt;li&gt;&lt;a href="http://www.visual-prolog.com/"&gt;Visual Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://sewiki.iai.uni-bonn.de/research/pdt/start"&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="http://en.wikipedia.org/wiki/Prolog"&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="http://en.wikibooks.org/wiki/Prolog"&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="http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/prolog/doc/standard/"&gt;черновик&lt;/a&gt; в PostScript формате.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://pauillac.inria.fr/~deransar/prolog/docs.html"&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="http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/intro.html"&gt;Prolog Tutorial&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.kuro5hin.org/print/2004/2/25/124713/784"&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;"Программирование на языке Пролог", У. Клоксин К. Меллиш ("Programming in Prolog" by W.F. Clocksin and C.S. Mellish),  &lt;li&gt;&lt;a href="http://www.softcraft.ru/paradigm/dp/index.shtml"&gt;"Декларативное программирование"&lt;/a&gt;, И.А.Дехтяренко,  &lt;li&gt;Программирование на языке Пролог для искусственного интеллекта, И. Братко,  &lt;li&gt;&lt;a href="http://www.learnprolognow.org"&gt;Learn Prolog Now&lt;/a&gt; by Patrick Blackburn, Johan Bos and Kristina Striegnitz&amp;nbsp; (&lt;a href="http://cs.union.edu/~striegnk/learn-prolog-now/html/index.html"&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="https://prof.ti.bfh.ch/hew1/informatik3/prolog/p-99/"&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="http://personnel.univ-reunion.fr/fred/Enseignement/Prolog/freestuff.html"&gt;Free stuff for programming in Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.cse.unsw.edu.au/~billw/prologdict.html"&gt;The Prolog Dictionary&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.cs.mu.oz.au/~lee/papers/ho/"&gt;Higher-order logic programming in Prolog&lt;/a&gt; (статья о программировании с правилами высшего порядка, сама статья в pdf лежит &lt;a href="http://www.cs.umbc.edu/771/papers/mu_96_02.pdf"&gt;отдельно&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;Очень краткое введение&lt;/h4&gt; &lt;p&gt;Пролог – это декларативный логический язык программирования. Основными его конструкциями являются логические предложения (например: human('Socrat') :- true.), на основании которых пролог строит некоторые логические выводы. Предложения объединяются в правила с помощью операции and, которая обозначается знаком ','. Предложение при проверке может создавать побочные эффекты, что используется для ввода/вывода.&lt;/p&gt; &lt;h4&gt;Краткий путеводитель по синтаксису&lt;/h4&gt;&lt;pre style="background-color: #ffffff; font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;﻿&lt;span style="color: #006633"&gt;% Это строчный комментарий&lt;/span&gt;
&lt;span style="color: #006633"&gt;/* А это блочный комментарий */&lt;/span&gt;

&lt;span style="color: #d11ced"&gt;goal&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;X&lt;span style="color: #555555"&gt;,&lt;/span&gt; Y&lt;span style="color: #555555"&gt;) :-&lt;/span&gt;   &lt;span style="color: #006633"&gt;% goal - это цель, для которой мы собираем правила,&lt;/span&gt;
                &lt;span style="color: #006633"&gt;% имя цели всегда начинается с маленькой буквы.&lt;/span&gt;
                &lt;span style="color: #006633"&gt;% результат у цели - это всегда true или false.&lt;/span&gt;
                &lt;span style="color: #006633"&gt;% X, Y - параметры цели.&lt;/span&gt;

    X &lt;span style="color: #555555"&gt;&amp;gt;&lt;/span&gt; Y       &lt;span style="color: #006633"&gt;% Первое утверждение, которое утверждает что X больше Y.&lt;/span&gt;

    &lt;span style="color: #555555"&gt;,&lt;/span&gt;           &lt;span style="color: #006633"&gt;% Разделитель между утверждениями, означает логическое И.&lt;/span&gt;

    X &lt;span style="color: #555555"&gt;+&lt;/span&gt; &lt;span style="color: #32ba06"&gt;1&lt;/span&gt; &lt;span style="color: #555555"&gt;==&lt;/span&gt; Y  &lt;span style="color: #006633"&gt;% Второе утверждение, которое может быть верным,&lt;/span&gt;
                &lt;span style="color: #006633"&gt;% только если Y = X + 1.&lt;/span&gt;

    &lt;span style="color: #555555"&gt;.&lt;/span&gt;           &lt;span style="color: #006633"&gt;% Точка означает конец описания цели.&lt;/span&gt;

&lt;span style="color: #006633"&gt;/*&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Суммирую:&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Имя цели всегда с маленькой буквы,&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Параметры цели, и все другие переменные с большой буквы,&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Утверждения разделяются запятой,&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Описание цели всегда заканчивается точкой.&lt;/span&gt;
&lt;span style="color: #006633"&gt; */&lt;/span&gt;

&lt;span style="color: #d11ced"&gt;prolog&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;&lt;span style="color: #1861a7"&gt;'logic language'&lt;/span&gt;&lt;span style="color: #555555"&gt;).&lt;/span&gt;
&lt;span style="color: #006633"&gt;% Так записываются некоторые факты,&lt;/span&gt;
&lt;span style="color: #006633"&gt;% и по сути являются сокращениями для цели,&lt;/span&gt;
&lt;span style="color: #006633"&gt;% которая всегда возвращает true.&lt;/span&gt;
&lt;span style="color: #006633"&gt;% в данном случае эквивалент выглядел бы так:&lt;/span&gt;
&lt;span style="color: #006633"&gt;% prolog('logic language') :- true.&lt;/span&gt;

&lt;span style="color: #006633"&gt;% Цели могут быть рекурсивными.&lt;/span&gt;
&lt;span style="color: #006633"&gt;% Посчитаем сумму от 0 до X.&lt;/span&gt;
&lt;span style="color: #d11ced"&gt;sum&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;&lt;span style="color: #32ba06"&gt;0&lt;/span&gt;&lt;span style="color: #555555"&gt;,&lt;/span&gt; &lt;span style="color: #32ba06"&gt;0&lt;/span&gt;&lt;span style="color: #555555"&gt;).&lt;/span&gt;   &lt;span style="color: #006633"&gt;% факт используется для остановки рекурсии.&lt;/span&gt;
&lt;span style="color: #d11ced"&gt;sum&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;X&lt;span style="color: #555555"&gt;,&lt;/span&gt; Result&lt;span style="color: #555555"&gt;) :-&lt;/span&gt;
    Y &lt;span style="color: #ff3030"&gt;is&lt;/span&gt; X &lt;span style="color: #555555"&gt;-&lt;/span&gt; &lt;span style="color: #32ba06"&gt;1&lt;/span&gt;&lt;span style="color: #555555"&gt;,&lt;/span&gt;             &lt;span style="color: #006633"&gt;% is - это по сути присвоение значения.&lt;/span&gt;
    &lt;span style="color: #d11ced"&gt;sum&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;Y&lt;span style="color: #555555"&gt;,&lt;/span&gt; SubResult&lt;span style="color: #555555"&gt;),&lt;/span&gt;      &lt;span style="color: #006633"&gt;% Рекурсивный вызов.&lt;/span&gt;
    Result &lt;span style="color: #ff3030"&gt;is&lt;/span&gt; X &lt;span style="color: #555555"&gt;+&lt;/span&gt; SubResult&lt;span style="color: #555555"&gt;.&lt;/span&gt;


&lt;span style="color: #006633"&gt;% Цель, которая будет использоваться при запуске программы,&lt;/span&gt;
&lt;span style="color: #006633"&gt;% имя 'main' выбрано мною произвольно.&lt;/span&gt;
main &lt;span style="color: #555555"&gt;:-&lt;/span&gt;
    &lt;span style="color: #006633"&gt;% запрашиваем значение факта&lt;/span&gt;
    &lt;span style="color: #d11ced"&gt;prolog&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;Which&lt;span style="color: #555555"&gt;),&lt;/span&gt;
    &lt;span style="color: #006633"&gt;% выводим значение на экран&lt;/span&gt;
    &lt;span style="color: #d11ced"&gt;format&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;&lt;span style="color: #1861a7"&gt;'prolog is a ~a.'&lt;/span&gt;&lt;span style="color: #555555"&gt;, [&lt;/span&gt;Which&lt;span style="color: #555555"&gt;]),&lt;/span&gt;

    &lt;span style="color: #006633"&gt;% newline&lt;/span&gt;
    &lt;span style="color: #ff3030"&gt;nl&lt;/span&gt;&lt;span style="color: #555555"&gt;,&lt;/span&gt;

    &lt;span style="color: #006633"&gt;% задаём значение X&lt;/span&gt;
    X &lt;span style="color: #ff3030"&gt;is&lt;/span&gt; &lt;span style="color: #32ba06"&gt;100&lt;/span&gt;&lt;span style="color: #555555"&gt;,&lt;/span&gt;
    &lt;span style="color: #006633"&gt;% считаем сумму от 0 до 100&lt;/span&gt;
    &lt;span style="color: #d11ced"&gt;sum&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;X&lt;span style="color: #555555"&gt;,&lt;/span&gt; Result&lt;span style="color: #555555"&gt;),&lt;/span&gt;
    &lt;span style="color: #006633"&gt;% выводим результат с помощью printf-like функции&lt;/span&gt;
    &lt;span style="color: #d11ced"&gt;format&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;&lt;span style="color: #1861a7"&gt;'sum(0, ~a) = ~a.'&lt;/span&gt;&lt;span style="color: #555555"&gt;, [&lt;/span&gt;X&lt;span style="color: #555555"&gt;,&lt;/span&gt; Result&lt;span style="color: #555555"&gt;]),&lt;/span&gt;

    &lt;span style="color: #006633"&gt;% newline.&lt;/span&gt;
    &lt;span style="color: #ff3030"&gt;nl&lt;/span&gt;&lt;span style="color: #555555"&gt;.&lt;/span&gt;

&lt;span style="color: #006633"&gt;/*&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Вывод программы при запуске:&lt;/span&gt;
&lt;span style="color: #006633"&gt; * prolog is a logic language.&lt;/span&gt;
&lt;span style="color: #006633"&gt; * sum(0, 100) = 5050.&lt;/span&gt;
&lt;span style="color: #006633"&gt; */&lt;/span&gt;
&lt;/pre&gt;
&lt;h4&gt;Типы данных&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Атом&lt;/strong&gt;: атом или 'атом', начинается с маленькой буквы или обрамляется одинарными кавычками.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Строка&lt;/strong&gt;: "Строка", обрамляется двойными кавычками, по факту представляет список из чисел – кодов 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="background-color: #ffffff; text-indent: 0px; margin: 12px 0px; -qt-block-indent: 0"&gt;&lt;span style="background-color: #ffffff; font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;main &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;:-&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;writeln&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #1861a7; font-size: 11pt"&gt;'Hello, Prolog World!'&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt; &lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Factorial.pro&lt;/strong&gt;:&lt;/p&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 12px 0px 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #006633; font-size: 11pt"&gt;% factorial implementation&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;factorial&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;factorial&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    X &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;0&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    X1 &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #ff3030; font-size: 11pt"&gt;is&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;-&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;factorial&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    Result &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #ff3030; font-size: 11pt"&gt;is&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;*&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: 'Consolas'; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;main &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;:-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;factorial&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;7&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;writeln&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt; &lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Fibonachi.pro&lt;/strong&gt;:&lt;/p&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 12px 0px 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #006633; font-size: 11pt"&gt;% Fibbonachi sequence implementation&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;0&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    X1 &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #ff3030; font-size: 11pt"&gt;is&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;-&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    X2 &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #ff3030; font-size: 11pt"&gt;is&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;-&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;2&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X2&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result2&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    Result &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #ff3030; font-size: 11pt"&gt;is&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result1 &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;+&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result2&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: 'Consolas'; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;main &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;:-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;7&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;writeln&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt; &lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&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="background-color: #ffffff; text-indent: 0px; margin: 12px 0px 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([], []).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;], [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;]).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; LeftSorted&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; RightSorted&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;append&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;LeftSorted&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; RightSorted&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: 'Consolas'; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;_&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [], [], []).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;], [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;=&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;]) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: 'Consolas'; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;append&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;append&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;]) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;append&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: 'Consolas'; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;main &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;:-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;5&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;4&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;6&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;3&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;2&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;writeln&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&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="http://google.com/search?q=programming+logical+language"&gt;нехитрых&lt;/a&gt; поисков в источниках близким к прологу собрал такой список:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.curry-language.org/"&gt;Curry Language&lt;/a&gt;, "A Truly Integrated Functional Logic Language":&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="http://www.cs.mu.oz.au/research/mercury/index.html"&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="http://www.mozart-oz.org/"&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="http://www.informatik.uni-kiel.de/~mh/systems/ALF.html"&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;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7550093075906678978-2690547713266031153?l=andir-notes.blogspot.com'/&gt;&lt;/div&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="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/2690547713266031153?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/2690547713266031153?v=2" /><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:extendedProperty name="OpenSocialUserId" value="05140528043797926954" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C04AR3g4eCp7ImA9WxNTEkg.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978.post-626576091076986896</id><published>2009-08-14T20:40:00.001+11:00</published><updated>2009-08-14T23:12:26.630+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-14T23:12:26.630+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="visual studio" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><title>Расширение отладчика SOS для Visual Studio 2008</title><content type="html">&lt;p&gt;Много раз во время отладки приложений, мне хотелось получать гораздо больше информации от отладчика, о том как расположены мои объекты в памяти, сколько занимают места, как давно созданы и сколько их существует. Обычно, такое нужно, когда хочется составить более полное представление о том, как работает программа.&lt;/p&gt;  &lt;p&gt;Так вот, оказывается существует специальное расширение для отладчиков Visual Studio и WinDbg, которое поставляется вместе с .Net Framework. Это расширение и называется SOS и находится в %SystemRoot%\Microsoft.Net\v2.0.50727\sos.dll для CLR 2.0.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Примечание: SOS расшифровывается как Son Of Strike.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Продемонстрирую работу с этим расширением и заодно покажу в действии набор команд, которые в нём существуют.&lt;/p&gt;  &lt;p&gt;Итак, первое. Реализуем небольшой пример:&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;A&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;uint&lt;/span&gt; Value { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; ToString()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Format(&lt;span style="color: #a31515"&gt;&amp;quot;A {{ Value = 0x{0:x} }}&amp;quot;&lt;/span&gt;, Value);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Program&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TestSOSMethod(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: #a31515"&gt;&amp;quot;Hello debugging world!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; TestSOSMethod(&lt;span style="color: blue"&gt;string&lt;/span&gt; ignoreThis)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; a &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;A&lt;/span&gt;() { Value &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: red"&gt;0xDEADBEEF&lt;/span&gt; };&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: blue"&gt;var&lt;/span&gt; b &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;A&lt;/span&gt;() { Value &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: red"&gt;0xBEEFDEAD&lt;/span&gt; };&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;Console&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;a = {0}, b = {1}&amp;quot;&lt;/span&gt;, a, b);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&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="color: #2b91af"&gt;Console&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;ReadKey(); &lt;span style="color: green"&gt;// breakpoint is here&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;В примере, вызывается метод с одним параметром и создаются два объекта типа &lt;strong&gt;Home.Andir.Examples.A&lt;/strong&gt; с магическими числами, которые потом будет хорошо видно в отладчике.&lt;/p&gt;

&lt;p&gt;Теперь, чтобы можно было воспользоваться возможностями SOS, нужно включить в свойствах проекта неуправляемую отладку.&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: VS2008 включение отладки в неуправляемом коде" border="0" alt="Скриншот: VS2008 включение отладки в неуправляемом коде" src="http://lh4.ggpht.com/_cqKDpMpIE24/SoUxB9c_PYI/AAAAAAAAAc8/JgKAzDeKK9I/vs2008_enable_unmanaged_debugging%5B4%5D.png?imgmax=800" width="698" height="606" /&gt; &lt;/p&gt;

&lt;p&gt;Теперь, устанавливаем точку остановки (Breakpoint) в статическом методе TestSOSMethod на строке Console.ReadKey(). И запускаем в режиме отладки (F5).&lt;/p&gt;

&lt;p&gt;В консоли будет выведено:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;a = A { Value = 0xdeadbeef }, b = A { Value = 0xbeefdead }&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", 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;Впрочем, как и ожидалось. Теперь загрузим sos.dll, для этого нужно открыть окно Immediate (Debug –&amp;gt; Windows –&amp;gt; Immediate) и написать первой командой &lt;strong&gt;.load sos.dll&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: окно Immediate и загрузка sos.dll" border="0" alt="Скриншот: окно Immediate и загрузка sos.dll" src="http://lh4.ggpht.com/_cqKDpMpIE24/SoUxCjzApkI/AAAAAAAAAdA/3WoI9kInWzA/vs2008_immediate_load_sos%5B4%5D.png?imgmax=800" width="518" height="276" /&gt; &lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;В окне выведено:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;.load sos.dll
extension C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll loaded&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", 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;Отлично! SOS успешно загрузился, и теперь можно поэкспериментировать с его командами. &lt;/p&gt;

&lt;p&gt;Начнём, как обычно с help.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;!help
-------------------------------------------------------------------------------
SOS &lt;span class="kwrd"&gt;is&lt;/span&gt; a debugger extension DLL designed to aid &lt;span class="kwrd"&gt;in&lt;/span&gt; the debugging of managed
programs. Functions are listed by category, then roughly &lt;span class="kwrd"&gt;in&lt;/span&gt; order of
importance. Shortcut names &lt;span class="kwrd"&gt;for&lt;/span&gt; popular functions are listed &lt;span class="kwrd"&gt;in&lt;/span&gt; parenthesis.
Type &lt;span class="str"&gt;&amp;quot;!help &amp;lt;functionname&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;for&lt;/span&gt; detailed info on that function. 

Object Inspection                  Examining code and stacks
-----------------------------      -----------------------------
DumpObj (&lt;span class="kwrd"&gt;do&lt;/span&gt;)                       Threads
DumpArray (da)                     CLRStack
DumpStackObjects (dso)             IP2MD
DumpHeap                           U
DumpVC                             DumpStack
GCRoot                             EEStack
ObjSize                            GCInfo
FinalizeQueue                      EHInfo
PrintException (pe)                COMState
TraverseHeap                       BPMD 

Examining CLR data structures      Diagnostic Utilities
-----------------------------      -----------------------------
DumpDomain                         VerifyHeap
EEHeap                             DumpLog
Name2EE                            FindAppDomain
SyncBlk                            SaveModule
DumpMT                             GCHandles
DumpClass                          GCHandleLeaks
DumpMD                             VMMap
Token2EE                           VMStat
EEVersion                          ProcInfo 
DumpModule                         StopOnException (soe)
ThreadPool                         MinidumpMode 
DumpAssembly                       
DumpMethodSig                      Other
DumpRuntimeTypes                   -----------------------------
DumpSig                            FAQ
RCWCleanupList
DumpIL&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", 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;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", 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;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", 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;Как видим, функций довольно много, и названия у них вполне себе говорящие. Подробнее о каждой функции можно узнать, если набрать !help &amp;lt;имя команды&amp;gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: В дальнейшем, вывод команды !help &amp;lt;имя команды&amp;gt; будет показываться в урезанном виде, чтобы исключить неважные в данном случае детали. Для подробного описания команды используйте MSDN или самостоятельно вызывайте эту команду.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Продолжим с нашим примером. Изучим команду clrstack, которая как очевидно из названия может инспектировать содержимое стека текущего потока.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;!help clrstack
-------------------------------------------------------------------------------
!CLRStack [-a] [-l] [-p]

CLRStack attempts to provide a &lt;span class="kwrd"&gt;true&lt;/span&gt; stack trace &lt;span class="kwrd"&gt;for&lt;/span&gt; managed code only. It &lt;span class="kwrd"&gt;is&lt;/span&gt;
handy &lt;span class="kwrd"&gt;for&lt;/span&gt; clean, simple traces when debugging straightforward managed 
programs. The -p parameter will show arguments to the managed function. The 
-l parameter can be used to show information on local variables &lt;span class="kwrd"&gt;in&lt;/span&gt; a frame.
SOS can't retrieve local names at &lt;span class="kwrd"&gt;this&lt;/span&gt; time, so the output &lt;span class="kwrd"&gt;for&lt;/span&gt; locals &lt;span class="kwrd"&gt;is&lt;/span&gt; &lt;span class="kwrd"&gt;in&lt;/span&gt;
the format &amp;lt;local address&amp;gt; = &amp;lt;&lt;span class="kwrd"&gt;value&lt;/span&gt;&amp;gt;. The -a (all) parameter &lt;span class="kwrd"&gt;is&lt;/span&gt; a &lt;span class="kwrd"&gt;short&lt;/span&gt;-cut
&lt;span class="kwrd"&gt;for&lt;/span&gt; -l and -p combined.&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", 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;Сейчас мы находимся внутри метода TestSOSMethod и можно посмотреть, что находится в данный момент в стеке текущего потока.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;!clrstack -a
OS Thread Id: 0x1984 (6532)
ESP       EIP     
0012ec2c 013b0178 Home.Andir.Examples.Program.TestSOSMethod(System.String)
    PARAMETERS:
        ignoreThis = 0x01a09290
    LOCALS:
        0x0012ec4c = &lt;font color="#ff0000"&gt;0x01a09304&lt;/font&gt;
        0x0012ec48 = &lt;font color="#0000ff"&gt;0x01a09310&lt;/font&gt;
        0x0012ec44 = &lt;font color="#ff0000"&gt;0x01a09304&lt;/font&gt;
        0x0012ec40 = &lt;font color="#0000ff"&gt;0x01a09310&lt;/font&gt;

0012ec94 013b00a0 Home.Andir.Examples.Program.Main(System.String[])
    PARAMETERS:
        args = 0x01a09280

0012eef4 67971b4c [GCFrame: 0012eef4] &lt;/pre&gt;

&lt;p&gt;Видим, что в стеке находится два метода и у текущего метода, есть один параметр с именем ignoreThis и четыре записи в локальных переменных с неизвестными именами (при этом объекта всего два, что видно по повторяющимся адресам). Теперь посмотрим значения этих параметров и переменных. Для начала, рассмотрим параметр ignoreThis.&lt;/p&gt;

&lt;p&gt;Чтобы посмотреть объекты в памяти существует команда dumpobj (сокращение do) которая принимает в параметре адрес объекта.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;!help dumpobj
-------------------------------------------------------------------------------
!DumpObj [-nofields] &amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt; address&amp;gt;

This command allows you to examine the fields of an &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;as&lt;/span&gt; well &lt;span class="kwrd"&gt;as&lt;/span&gt; learn 
important properties of the &lt;span class="kwrd"&gt;object&lt;/span&gt; such &lt;span class="kwrd"&gt;as&lt;/span&gt; the EEClass, the MethodTable, and 
the size.

The arguments &lt;span class="kwrd"&gt;in&lt;/span&gt; detail:
-nofields:     &lt;span class="kwrd"&gt;do&lt;/span&gt; not print fields of the &lt;span class="kwrd"&gt;object&lt;/span&gt;, useful &lt;span class="kwrd"&gt;for&lt;/span&gt; objects like 
                  String&lt;/pre&gt;

&lt;p&gt;Итак, вызываем dumpobj для объект ignoreThis (используем параметр –nofields чтобы не выводить ненужные нам поля объекта string):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;!dumpobj -nofields 0x01a09290
Name: System.String
MethodTable: 670d88a4
EEClass: 66e9a498
Size: 62(0x3e) bytes
 (C:\Windows\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: Hello debugging world!&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", 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;Итак, в параметре находится та самая строка, ради которой этот параметр и затевался :-) Занимает она 62 байта, что с учётом длины строки в 22 символа, и по 2 байта на символ в кодировке Unicode – получаем 18 байт оверхеда на хранение такой строки в типе System.String.&lt;/p&gt;

&lt;p&gt;Продолжаем исследовать объекты в стеке, теперь посмотрим на локальные переменные (сразу все по очереди):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;!&lt;span class="kwrd"&gt;do&lt;/span&gt; 0x01a09304
Name: Home.Andir.Examples.A
MethodTable: 0024338c
EEClass: 00241830
Size: 12(0xc) bytes
 (D:\development\projects\andir-notes\examples\SOSDebugExtension\SOSDebugExtension\bin\Debug\SOSDebugExtension.exe)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
670b9cc8  4000001        4        System.UInt32  1 instance 3735928559 &amp;lt;Value&amp;gt;k__BackingField

!&lt;span class="kwrd"&gt;do&lt;/span&gt; 0x01a09310
Name: Home.Andir.Examples.A
MethodTable: 0024338c
EEClass: 00241830
Size: 12(0xc) bytes
 (D:\development\projects\andir-notes\examples\SOSDebugExtension\SOSDebugExtension\bin\Debug\SOSDebugExtension.exe)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
670b9cc8  4000001        4        System.UInt32  1 instance 3203391149 &amp;lt;Value&amp;gt;k__BackingField&lt;/pre&gt;

&lt;p&gt;Видим два объекта в памяти типа &lt;strong&gt;Home.Andir.Examples.A&lt;/strong&gt;, которые занимают по 12 байт и содержат ровно одно поле со странным именем &lt;em&gt;&amp;lt;Value&amp;gt;k__BackingField&lt;/em&gt; и типом System.UInt32, как очевидно, которое является автоматически сгененированным полем для автосвойства &lt;em&gt;Value.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Каждый объект занимает 12 байт, а так как внутри находится только 1 поле длиной 4 байта, то получаем что оверхед равняется 8 байтам.&lt;/p&gt;

&lt;p&gt; Ещё одна полезная команда, которая позволит убедиться, что у нас в памяти находится ровно два объекта. Это dumpheap, у которой есть параметр –type для фильтрации вывода по имени типа (всё же в хипе находится довольно много служебной информации).&lt;/p&gt;

&lt;pre class="csharpcode"&gt;!dumpheap -type Home.Andir.Examples.A
 Address       MT     Size
01a09304 0024338c       12     
01a09310 0024338c       12     
total 2 objects
Statistics:
      MT    Count    TotalSize Class Name
0024338c        2           24 Home.Andir.Examples.A
Total 2 objects&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", 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;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", 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;О том, сколько всякого мусора находится в GC Heap можно узнать с помощью этой же команды и параметра –stat.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;!dumpheap -stat
total 7737 objects
Statistics:
      MT    Count    TotalSize Class Name
670e18f0        1           12 System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib]]
670e0ba0        1           12 System.Security.Permissions.ReflectionPermission
670df8a8        1           12 System.Resources.FastResourceComparer
670dcd44        1           12 System.__Filters
....&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", 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;Теперь понятно, зачем нужна фильтрация по имени типа. На самом деле, команда dumpheap – очень мощная команда и позволяет исследовать многие параметры GC Heap (см. !help dumpheap, где есть в том числе и примеры её полноценного использования). &lt;/p&gt;

&lt;h4&gt;Далее&lt;/h4&gt;

&lt;p&gt;Для подробного изучения порекомендую посетить следующие ресурсы:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb190764%28VS.80%29.aspx"&gt;MSDN: SOS Debugging Extension (SOS.dll)&lt;/a&gt;,&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc164138.aspx"&gt;MSDN Magazine: Bugslayer column: SOS: It's Not Just an ABBA Song Anymore&lt;/a&gt;,&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://dotnetdebug.net/tag/sos/"&gt;Eran Sandler: Advanced .NET Debugging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Также, рекомендую прочитать Success Story об удачном использовании SoS для обнаружения проблем в приложении ASP.Net: &lt;a href="http://mcfunley.com/229/app-server-autopsy"&gt;Dan McKinley: App Server Autopsy&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7550093075906678978-626576091076986896?l=andir-notes.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://andir-notes.blogspot.com/feeds/626576091076986896/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://andir-notes.blogspot.com/2009/08/sos-debugging-extension-for-vs2008.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/626576091076986896?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/626576091076986896?v=2" /><link rel="alternate" type="text/html" href="http://andir-notes.blogspot.com/2009/08/sos-debugging-extension-for-vs2008.html" title="Расширение отладчика SOS для Visual Studio 2008" /><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="05140528043797926954" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CkANSHo7eCp7ImA9WxNTEEw.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978.post-2893633038747626458</id><published>2009-08-12T03:26:00.001+11:00</published><updated>2009-08-12T04:13:19.400+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-12T04:13:19.400+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="visual studio" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><title>Visual Studio 2010 – Historical Debugger</title><content type="html">&lt;p&gt;Случайно посмотрел PodCast про новую фенечку в Visual Studio 2010. Это так называемый Historical Debugger (&amp;quot;Исторический отладчик&amp;quot;).&lt;/p&gt;  &lt;p&gt;На мой первый взгляд – весьма примечательная и полезная вещь.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://channel9.msdn.com/shows/10-4/10-4-Episode-28-An-Introduction-to-the-Historical-Debugger/"&gt;&lt;strong&gt;MSDN 9 Channel: An Introduction to the Historical Debugger&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="320" height="240"&gt; &lt;param name="source" value="http://channel9.msdn.com/App_Themes/default/vp09_06_22.xap" /&gt; &lt;param name="initParams" value="m=http://mschnlnine.vo.llnwd.net/d1/ch9/4/1/2/0/8/4/104Episode28AnIntroductionToTheHistoricalDebugger_2MB_ch9.wmv,autostart=false,autohide=true,showembed=true, thumbnail=http://mschnlnine.vo.llnwd.net/d1/ch9/4/1/2/0/8/4/104Episode28AnIntroductionToTheHistoricalDebugger_large_ch9.png, postid=480214" /&gt; &lt;param name="background" value="#00FFFFFF" /&gt; &lt;a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;"&gt; &lt;img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /&gt; &lt;/a&gt; &lt;/object&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Замечание: Ну и быстро говорит этот товарищ!&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;По сути, что там происходит: система записывает (Trace) состояние приложения в контрольных точках (события, исключения и т.п.) и затем позволяет разработчику во время отладки воспроизвести выполнение приложения по шагам. Это, предположительно, позволяет упростить отладку в особо сложных случаях (например, когда ошибка возникает только у пользователей в их специфичных условиях работы). Словом, это такой способ воспроизведения ошибок, когда нет необходимости воспроизведения условий их возникновения. &lt;/p&gt;  &lt;p&gt;А для продвинутых пользователей (тестеров и самих разработчиков) появится возможность приложить &amp;quot;Лог исполнения&amp;quot; (Execution Log) к описанию ошибки в багтрекере. Затем разработчик ответственный за исправление ошибки сможет использовать этот лог для быстрой диагностики ошибки и её исправления.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Настройки в VS:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: VS2010 Options - Historical Debugging" border="0" alt="Скриншот: VS2010 Options - Historical Debugging" src="http://lh4.ggpht.com/_cqKDpMpIE24/SoGerwTTs9I/AAAAAAAAAcw/JJvttR65IN0/vs2010%20options%20-%20Debug%20History%5B4%5D.png?imgmax=800" width="631" height="381" /&gt; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Новая вкладка&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Скриншот: Вкладка &amp;quot;Debug History&amp;quot; в действии" border="0" alt="Скриншот: Вкладка &amp;quot;Debug History&amp;quot; в действии" src="http://lh5.ggpht.com/_cqKDpMpIE24/SoGbxh_hjHI/AAAAAAAAAc0/wOs-H_6MQKE/history%20debugger%5B15%5D.png?imgmax=800" width="301" height="541" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Подробнее о новом отладчике можно прочитать:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/ianhu/archive/2009/05/13/historical-debugging-in-visual-studio-team-system-2010.aspx"&gt;IanWho: Historical Debugging in Visual Studio Team System 2010&lt;/a&gt;, &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/06/16/how-does-vs2010-historical-debugging-work.aspx"&gt;John Robbins (Wintellect): How Does VS2010 Historical Debugging Work?&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7550093075906678978-2893633038747626458?l=andir-notes.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://andir-notes.blogspot.com/feeds/2893633038747626458/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://andir-notes.blogspot.com/2009/08/visual-studio-2010-historical-debugger.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/2893633038747626458?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/2893633038747626458?v=2" /><link rel="alternate" type="text/html" href="http://andir-notes.blogspot.com/2009/08/visual-studio-2010-historical-debugger.html" title="Visual Studio 2010 – Historical Debugger" /><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="05140528043797926954" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry></feed>
