<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Sort List elements by  value parameter in Revit API Forum</title>
    <link>https://forums.autodesk.com/t5/revit-api-forum/sort-list-elements-by-value-parameter/m-p/8198731#M48278</link>
    <description>Good day, I'm learning c #, I have a list obtained through a pickobjects, which I want to sort according to the value of a parameter. something similar to what the python node of the image does.</description>
    <pubDate>Tue, 14 Aug 2018 15:14:44 GMT</pubDate>
    <dc:creator>jamess166</dc:creator>
    <dc:date>2018-08-14T15:14:44Z</dc:date>
    <item>
      <title>Sort List elements by  value parameter</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/sort-list-elements-by-value-parameter/m-p/8198731#M48278</link>
      <description>Good day, I'm learning c #, I have a list obtained through a pickobjects, which I want to sort according to the value of a parameter. something similar to what the python node of the image does.</description>
      <pubDate>Tue, 14 Aug 2018 15:14:44 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/sort-list-elements-by-value-parameter/m-p/8198731#M48278</guid>
      <dc:creator>jamess166</dc:creator>
      <dc:date>2018-08-14T15:14:44Z</dc:date>
    </item>
    <item>
      <title>Re: Sort List elements by  value parameter</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/sort-list-elements-by-value-parameter/m-p/8199040#M48279</link>
      <description>&lt;P&gt;If you&amp;nbsp;haven't learned about labda/&lt;A href="http://www.tutorialsteacher.com/csharp/csharp-predicate" target="_blank"&gt;predicates &lt;/A&gt;and &lt;A href="http://www.tutorialsteacher.com/csharp/csharp-linq" target="_blank"&gt;Linq &lt;/A&gt;yet, those are great concepts to learn in C#. Then you can use the &lt;A href="https://msdn.microsoft.com/en-us/library/bb534966(v=vs.110).aspx" target="_blank"&gt;OrderBy&lt;/A&gt; method to sort.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, in your case, you'd&amp;nbsp;have to combine&amp;nbsp;it with some more code:&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;PickObjects()&lt;/FONT&gt;, returns an &lt;FONT face="courier new,courier"&gt;IList&amp;lt;Reference&amp;gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;From each &lt;FONT face="courier new,courier"&gt;Reference&lt;/FONT&gt; you need to get the &lt;FONT face="courier new,courier"&gt;Element&lt;/FONT&gt;, then you have to get the value of the parameter you need, then sort by that value. Something like this (very simplified):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;// Get picked object references&lt;BR /&gt;IList&amp;lt;Reference&amp;gt; pickedObjects = uidoc.Selection.PickObject(...);

// Convert all references to elements
List&amp;lt;Element&amp;gt; pickedElements = pickedObjects.Select(x=&amp;gt;doc.GetElement(x)).ToList();

// Sort all elements by the value of "MY_PARAMETER"
List&amp;lt;Element&amp;gt; sortedElements = pickedElements.OrderBy(x=&amp;gt;x["MY_PARAMETER"].AsDouble()).ToList();&lt;/PRE&gt;&lt;P&gt;Be aware, that&amp;nbsp;this is not very efficient as you will have to query "MY_PARAMETER" more than once for each object (the &lt;FONT face="courier new,courier"&gt;OrderBy&lt;/FONT&gt; function will do that). So if it's too slow you will have to cache the parameter value in something like a &lt;FONT face="courier new,courier"&gt;Tuple&amp;lt;Double, Element&amp;gt;&lt;/FONT&gt;.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Also, you&amp;nbsp;should handle errors when the parameter isn't present on an object or parameter doesn't have a value.&lt;/P&gt;</description>
      <pubDate>Tue, 14 Aug 2018 16:31:25 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/sort-list-elements-by-value-parameter/m-p/8199040#M48279</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2018-08-14T16:31:25Z</dc:date>
    </item>
    <item>
      <title>Re: Sort List elements by  value parameter</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/sort-list-elements-by-value-parameter/m-p/8207782#M48280</link>
      <description>&lt;P&gt;Thanks, apparently I have to resort to the lambda code which I do not know, any website or blog where I can learn it. Thank you.&lt;/P&gt;</description>
      <pubDate>Fri, 17 Aug 2018 19:36:02 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/sort-list-elements-by-value-parameter/m-p/8207782#M48280</guid>
      <dc:creator>jamess166</dc:creator>
      <dc:date>2018-08-17T19:36:02Z</dc:date>
    </item>
    <item>
      <title>Re: Sort List elements by  value parameter</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/sort-list-elements-by-value-parameter/m-p/8212144#M48281</link>
      <description>&lt;P&gt;You can think of a lambda as just a function without a name (syntactic sugar done by the compiler) can be as simple as:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Imagine you have:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;public&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;class&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Thing&lt;/SPAN&gt;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;public&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;int&lt;/SPAN&gt;&amp;nbsp;Index&amp;nbsp;{&amp;nbsp;&lt;SPAN&gt;get&lt;/SPAN&gt;;&amp;nbsp;&lt;SPAN&gt;set&lt;/SPAN&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;public&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;string&lt;/SPAN&gt;&amp;nbsp;Name&amp;nbsp;{&amp;nbsp;&lt;SPAN&gt;get&lt;/SPAN&gt;;&amp;nbsp;&lt;SPAN&gt;set&lt;/SPAN&gt;;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;public&lt;/SPAN&gt;&amp;nbsp;Thing(&lt;SPAN&gt;int&lt;/SPAN&gt;&amp;nbsp;index,&amp;nbsp;&lt;SPAN&gt;string&lt;/SPAN&gt;&amp;nbsp;name)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Index&amp;nbsp;&lt;SPAN&gt;=&lt;/SPAN&gt;&amp;nbsp;index;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name&amp;nbsp;&lt;SPAN&gt;=&lt;/SPAN&gt;&amp;nbsp;name;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;public&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;static&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;string&lt;/SPAN&gt;&amp;nbsp;GetThingName(&lt;SPAN&gt;Thing&lt;/SPAN&gt;&amp;nbsp;x)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;return&lt;/SPAN&gt;&amp;nbsp;x&lt;SPAN&gt;.&lt;/SPAN&gt;Name;
}&lt;BR /&gt;&lt;BR /&gt;public static int GetThingIndex(Thing x)&lt;BR /&gt;{&lt;BR /&gt;    return x.Index;&lt;BR /&gt;}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Then,&amp;nbsp;you could order an array of &lt;FONT face="courier new,courier"&gt;Thing&lt;/FONT&gt;s like this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;Thing&lt;/SPAN&gt;[]&amp;nbsp;things&amp;nbsp;&lt;SPAN&gt;=&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;new&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Thing&lt;/SPAN&gt;[]&amp;nbsp;{&amp;nbsp;&lt;SPAN&gt;new&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Thing&lt;/SPAN&gt;(&lt;SPAN&gt;1&lt;/SPAN&gt;,&amp;nbsp;&lt;SPAN&gt;"one"&lt;/SPAN&gt;),&amp;nbsp;&lt;SPAN&gt;new&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Thing&lt;/SPAN&gt;(&lt;SPAN&gt;11&lt;/SPAN&gt;,&amp;nbsp;&lt;SPAN&gt;"eleven"&lt;/SPAN&gt;),&amp;nbsp;&lt;SPAN&gt;new&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Thing&lt;/SPAN&gt;(&lt;SPAN&gt;4&lt;/SPAN&gt;,&amp;nbsp;&lt;SPAN&gt;"four"&lt;/SPAN&gt;)&amp;nbsp;};
// Order by the index, the following two lines do the exact same thing:&lt;BR /&gt;things&lt;SPAN&gt;.&lt;/SPAN&gt;OrderBy(x&amp;nbsp;&lt;SPAN&gt;=&amp;gt;&lt;/SPAN&gt;&amp;nbsp;x&lt;SPAN&gt;.&lt;/SPAN&gt;Index);  // With a labda
things&lt;SPAN&gt;.&lt;/SPAN&gt;OrderBy(GetThingIndex); // With a dedicated function
&lt;BR /&gt;// Order by the name, the following two lines do the exact same thing:&lt;BR /&gt;things&lt;SPAN&gt;.&lt;/SPAN&gt;OrderBy(x&amp;nbsp;&lt;SPAN&gt;=&amp;gt;&lt;/SPAN&gt;&amp;nbsp;x&lt;SPAN&gt;.&lt;/SPAN&gt;Name);   // With a lambda&lt;BR /&gt;things&lt;SPAN&gt;.&lt;/SPAN&gt;OrderBy(GetThingName);  // With a dedicated function&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So basically, lambdas&amp;nbsp;allow you to write less code (and, of course, they can be much more complicated than example above).&amp;nbsp;Hope this helps.&amp;nbsp;You can read more on these sites:&lt;/P&gt;&lt;P&gt;&lt;A href="https://linqsamples.com/linq-to-objects/ordering/OrderBy-numbers-lambda" target="_blank"&gt;https://linqsamples.com/linq-to-objects/ordering/OrderBy-numbers-lambda&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="https://weblogs.asp.net/dixin/understanding-csharp-features-5-lambda-expression" target="_blank"&gt;https://weblogs.asp.net/dixin/understanding-csharp-features-5-lambda-expression&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 20 Aug 2018 19:20:50 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/sort-list-elements-by-value-parameter/m-p/8212144#M48281</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2018-08-20T19:20:50Z</dc:date>
    </item>
  </channel>
</rss>

