<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416470&amp;view=findpost&amp;p=3817378</guid>
        <pubDate>Thu, 26 Dec 2019 20:11:35 +0000</pubDate>
        <title>Глубокая копия списка объектов</title>
        <link>https://forum.sources.ru/index.php?showtopic=416470&amp;view=findpost&amp;p=3817378</link>
        <description><![CDATA[Cfon: Разобрался&#33; :blush:   <br>
Короче Select операция ленивая, т.е. при ее вызове мы нифига не получаем&#33; :blink: <br>
Да-да не удивляйтесь&#33; :D <br>
А чтобы селект вернул результат надо применить к нему какую-либо, так называемую энергичную операцию, например ToArray:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp;var personsCopy := TEnumerable.Select&#60;TPerson, TPerson&#62;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;TCollections.CreateList&#60;TPerson&#62;(persons),</div><div class="code_line">&nbsp;&nbsp; &nbsp;function (p: TPerson): TPerson</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := TPerson.Create(p.Name, p.Age); //&#60;-- new person</div><div class="code_line">&nbsp;&nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp;)</div><div class="code_line">&nbsp;&nbsp;.ToArray; //&#60;-- </div><div class="code_line">...</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Теперь вывод правильный<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">XXX</div><div class="code_line">Mark</div><div class="code_line">Julia</div><div class="code_line">&nbsp;</div><div class="code_line">Gregory</div><div class="code_line">Mark</div><div class="code_line">Julia</div><div class="code_line">&nbsp;</div><div class="code_line">--&#62; TPerson deleting...</div><div class="code_line">--&#62; TPerson deleting...</div><div class="code_line">--&#62; TPerson deleting...</div></ol></div></div></div></div><br>
Теперь по поводу удаления 3х объектов из 6. Тут при вызове селект я передаю ему результат CreateList&lt;TPerson&gt;(persons), а он не контролит создаваемые внутри объекты. Надо бы заюзать CreateObjectList, но не при передаче в селект, а обернуть им сам селект, тогда можно убрать вызов ToArray, поскольку сама передача селекта в CreateObjectList активирует операцию селект:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;var personsCopy := TCollections.CreateObjectList&#60;TPerson&#62;( //&#60;-- </div><div class="code_line">&nbsp;&nbsp; &nbsp;TEnumerable.Select&#60;TPerson, TPerson&#62;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;persons,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;function (p: TPerson): TPerson</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := TPerson.Create(p.Name, p.Age); </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp;)</div><div class="code_line">&nbsp;&nbsp;);</div></ol></div></div></div></div><br>
Выхлоп<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">XXX</div><div class="code_line">Mark</div><div class="code_line">Julia</div><div class="code_line">&nbsp;</div><div class="code_line">Gregory</div><div class="code_line">Mark</div><div class="code_line">Julia</div><div class="code_line">&nbsp;</div><div class="code_line">--&#62; TPerson deleting...</div><div class="code_line">--&#62; TPerson deleting...</div><div class="code_line">--&#62; TPerson deleting...</div><div class="code_line">--&#62; TPerson deleting...</div><div class="code_line">--&#62; TPerson deleting...</div><div class="code_line">--&#62; TPerson deleting...</div></ol></div></div></div></div><br>
ВСЕ&#33;  :victory:]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416470&amp;view=findpost&amp;p=3817377</guid>
        <pubDate>Thu, 26 Dec 2019 19:13:57 +0000</pubDate>
        <title>Глубокая копия списка объектов</title>
        <link>https://forum.sources.ru/index.php?showtopic=416470&amp;view=findpost&amp;p=3817377</link>
        <description><![CDATA[Cfon: Проделал следующее, добавил символ ` после имени персоны чтобы было видно где какие данные<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp;var personsCopy := TEnumerable.Select&#60;TPerson, TPerson&#62;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;TCollections.CreateList&#60;TPerson&#62;(persons),</div><div class="code_line">&nbsp;&nbsp; &nbsp;function (p: TPerson): TPerson</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := TPerson.Create(p.Name + &#39;`&#39;, p.Age); //&#60;-- add ` sign</div><div class="code_line">&nbsp;&nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">...</div></ol></div></div></div></div><br>
Теперь выхлоп такой  :blink: <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">XXX</div><div class="code_line">Mark</div><div class="code_line">Julia</div><div class="code_line">&nbsp;</div><div class="code_line">XXX`</div><div class="code_line">Mark`</div><div class="code_line">Julia`</div><div class="code_line">&nbsp;</div><div class="code_line">--&#62; TPerson deleting...</div><div class="code_line">--&#62; TPerson deleting...</div><div class="code_line">--&#62; TPerson deleting...</div></ol></div></div></div></div><br>
Это как могло получиться? :D]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416470&amp;view=findpost&amp;p=3817375</guid>
        <pubDate>Thu, 26 Dec 2019 18:27:29 +0000</pubDate>
        <title>Глубокая копия списка объектов</title>
        <link>https://forum.sources.ru/index.php?showtopic=416470&amp;view=findpost&amp;p=3817375</link>
        <description><![CDATA[Cfon: Запутался...  :huh:  <br>
Как сделать глубокую копию списка объектов? <br>
Ниже пробовал через Select, но фиг поймет не работает, при изменении данных в одном из списков меняется другой список тоже (комметами пометил важные места кода). Специально определил деструктор Tperson чтобы отследить удаления, но как видите удаляются всего 3 объекта, куда делись еще 3&#33;&#33;&#33; :wacko:<br>
Я вроде создаю на каждой итерации новый объект TPerson или нет?  <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit uPersonDemo;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;System.SysUtils,</div><div class="code_line">&nbsp;&nbsp;Spring.Collections;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TPerson = class</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;Name: string;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Age: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;constructor Create(AName: string; AAge: integer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;destructor Destroy; override;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure ProcessPersons;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{ TPerson }</div><div class="code_line">&nbsp;</div><div class="code_line">constructor TPerson.Create(AName: string; AAge: integer);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Name:= AName;</div><div class="code_line">&nbsp;&nbsp;Age:= AAge;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">destructor TPerson.Destroy;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Writeln(&#39;--&#62; TPerson deleting...&#39;);</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure ProcessPersons;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;var persons := TCollections.CreateObjectList&#60;TPerson&#62;([</div><div class="code_line">&nbsp;&nbsp; &nbsp;TPerson.Create(&#39;Gregory&#39;, 42),</div><div class="code_line">&nbsp;&nbsp; &nbsp;TPerson.Create(&#39;Mark&#39;, 27),</div><div class="code_line">&nbsp;&nbsp; &nbsp;TPerson.Create(&#39;Julia&#39;, 23)</div><div class="code_line">&nbsp;&nbsp;]);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;var personsCopy := TEnumerable.Select&#60;TPerson, TPerson&#62;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;TCollections.CreateList&#60;TPerson&#62;(persons),</div><div class="code_line">&nbsp;&nbsp; &nbsp;function (p: TPerson): TPerson</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := TPerson.Create(p.Name, p.Age); // new person</div><div class="code_line">&nbsp;&nbsp; &nbsp;end);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;persons[0].Name := &#39;XXX&#39;; // change person name</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// output</div><div class="code_line">&nbsp;&nbsp;for var p in persons do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(Format(&#39;%s&#39;, [p.Name]));</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;Writeln;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for var p in personsCopy do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(Format(&#39;%s&#39;, [p.Name]));</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;Writeln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
Выхлоп<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">XXX</div><div class="code_line">Mark</div><div class="code_line">Julia</div><div class="code_line">&nbsp;</div><div class="code_line">XXX</div><div class="code_line">Mark</div><div class="code_line">Julia</div><div class="code_line">&nbsp;</div><div class="code_line">--&#62; TPerson deleting...</div><div class="code_line">--&#62; TPerson deleting...</div><div class="code_line">--&#62; TPerson deleting...</div></ol></div></div></div></div>]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	