<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lachesis+Ethereal</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lachesis+Ethereal"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Lachesis_Ethereal"/>
	<updated>2026-06-28T02:49:04Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ListUnique&amp;diff=1218485</id>
		<title>ListUnique</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ListUnique&amp;diff=1218485"/>
		<updated>2025-10-13T20:29:56Z</updated>

		<summary type="html">&lt;p&gt;Lachesis Ethereal: /* Function: list ListSortedAndUnique(list {{LSL Param|input}}, integer {{LSL Param|ascending}}) */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}} __NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== Function: [[list]] ListUnique([[list]] {{LSL Param|lAll) }}; ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
Given a list of elements, strips out any duplicates in that list, and returns the de-duped list.&lt;br /&gt;
&lt;br /&gt;
See also: [[List|Lists]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
list ListUnique( list lAll ) {&lt;br /&gt;
    integer i;&lt;br /&gt;
    list lFiltered = llList2List(lAll, 0, 0);&lt;br /&gt;
    integer iAll = llGetListLength( lAll );&lt;br /&gt;
    for (i = 1; i &amp;lt; iAll; ++i) {&lt;br /&gt;
        if ( llListFindList(lFiltered, llList2List(lAll, i, i) ) == -1 ) {&lt;br /&gt;
            lFiltered += llList2List(lAll, i, i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return lFiltered;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
list mylist = ListUnique([&amp;quot;A&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;B&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
would return the list:&lt;br /&gt;
&lt;br /&gt;
[&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Originated in a November 2004 thread led by Chromal Brodsky in the SL Scripting Forum. http://forums-archive.secondlife.com/54/30/28137/1.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== Function: [[list]] ListSortedAndUnique([[list]] {{LSL Param|input}}, [[integer]] {{LSL Param|ascending}}) ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t need to maintain the order of items (or want them sorted anyway), the following code is consistently about 2x faster on short lists, and 3-5x faster on lists with hundreds of items.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;list ListSortedAndUnique(list input, integer ascending) {&lt;br /&gt;
    input = llListSort(input, 1, ascending);&lt;br /&gt;
    integer index;&lt;br /&gt;
    list    last   = llList2List(input, 0, 0);&lt;br /&gt;
    list    result = last;&lt;br /&gt;
    for (index = 1 - llGetListLength(input); index &amp;lt; 0; ++index) {&lt;br /&gt;
        list current =  llList2List(input, index, index);&lt;br /&gt;
        if (llListFindList(current, last) &amp;lt; 0) {&lt;br /&gt;
            last    = current;&lt;br /&gt;
            result += last; &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The reason is that [[llListFindList]] performs a linear scan through the entire list, thus ListUnique compares every element with every other element. [[llListSort]] however compares each element only to a few others (the exact number depending on the sorting algorithm), and after sorting ListSortedAndUnique only compares neighboring elements.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{LSLC|Examples|ListUnique}}&lt;br /&gt;
{{LSLC|Examples|ListSortedAndUnique}}&lt;br /&gt;
[[Category:LSL_User-Defined Functions]]&lt;/div&gt;</summary>
		<author><name>Lachesis Ethereal</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ListUnique&amp;diff=1218484</id>
		<title>ListUnique</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ListUnique&amp;diff=1218484"/>
		<updated>2025-10-13T20:29:33Z</updated>

		<summary type="html">&lt;p&gt;Lachesis Ethereal: /* Function: list ListSortedAndUnique(list {{LSL Param|input}}, integer {{LSL Param|ascending}}) */ The reason is that llListFindList performs a linear scan through the entire list ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}} __NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== Function: [[list]] ListUnique([[list]] {{LSL Param|lAll) }}; ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
Given a list of elements, strips out any duplicates in that list, and returns the de-duped list.&lt;br /&gt;
&lt;br /&gt;
See also: [[List|Lists]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
list ListUnique( list lAll ) {&lt;br /&gt;
    integer i;&lt;br /&gt;
    list lFiltered = llList2List(lAll, 0, 0);&lt;br /&gt;
    integer iAll = llGetListLength( lAll );&lt;br /&gt;
    for (i = 1; i &amp;lt; iAll; ++i) {&lt;br /&gt;
        if ( llListFindList(lFiltered, llList2List(lAll, i, i) ) == -1 ) {&lt;br /&gt;
            lFiltered += llList2List(lAll, i, i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return lFiltered;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
list mylist = ListUnique([&amp;quot;A&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;B&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
would return the list:&lt;br /&gt;
&lt;br /&gt;
[&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Originated in a November 2004 thread led by Chromal Brodsky in the SL Scripting Forum. http://forums-archive.secondlife.com/54/30/28137/1.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== Function: [[list]] ListSortedAndUnique([[list]] {{LSL Param|input}}, [[integer]] {{LSL Param|ascending}}) ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t need to maintain the order of items (or want them sorted anyway), the following code is consistently about 2x faster on short lists, and 3-5x faster on lists with hundreds of items.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;list ListSortedAndUnique(list input, integer ascending) {&lt;br /&gt;
    input = llListSort(input, 1, ascending);&lt;br /&gt;
    integer index;&lt;br /&gt;
    list    last   = llList2List(input, 0, 0);&lt;br /&gt;
    list    result = last;&lt;br /&gt;
    for (index = 1 - llGetListLength(input); index &amp;lt; 0; ++index) {&lt;br /&gt;
        list current =  llList2List(input, index, index);&lt;br /&gt;
        if (llListFindList(current, last) &amp;lt; 0) {&lt;br /&gt;
            last    = current;&lt;br /&gt;
            result += last; &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The reason is that [[llListFindList]] performs a linear scan through the entire list, thus ListUnique compares every element with every other element. [[llSort]] however compares each element only to a few others (the exact number depending on the sorting algorithm), and after sorting ListSortedAndUnique only compares neighboring elements.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{LSLC|Examples|ListUnique}}&lt;br /&gt;
{{LSLC|Examples|ListSortedAndUnique}}&lt;br /&gt;
[[Category:LSL_User-Defined Functions]]&lt;/div&gt;</summary>
		<author><name>Lachesis Ethereal</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ListUnique&amp;diff=1218483</id>
		<title>ListUnique</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ListUnique&amp;diff=1218483"/>
		<updated>2025-10-13T20:17:35Z</updated>

		<summary type="html">&lt;p&gt;Lachesis Ethereal: /* Function: list ListSortedAndUnique(list {{LSL Param|input}}, integer {{LSL Param|ascending}}) */ fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}} __NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== Function: [[list]] ListUnique([[list]] {{LSL Param|lAll) }}; ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
Given a list of elements, strips out any duplicates in that list, and returns the de-duped list.&lt;br /&gt;
&lt;br /&gt;
See also: [[List|Lists]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
list ListUnique( list lAll ) {&lt;br /&gt;
    integer i;&lt;br /&gt;
    list lFiltered = llList2List(lAll, 0, 0);&lt;br /&gt;
    integer iAll = llGetListLength( lAll );&lt;br /&gt;
    for (i = 1; i &amp;lt; iAll; ++i) {&lt;br /&gt;
        if ( llListFindList(lFiltered, llList2List(lAll, i, i) ) == -1 ) {&lt;br /&gt;
            lFiltered += llList2List(lAll, i, i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return lFiltered;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
list mylist = ListUnique([&amp;quot;A&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;B&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
would return the list:&lt;br /&gt;
&lt;br /&gt;
[&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Originated in a November 2004 thread led by Chromal Brodsky in the SL Scripting Forum. http://forums-archive.secondlife.com/54/30/28137/1.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== Function: [[list]] ListSortedAndUnique([[list]] {{LSL Param|input}}, [[integer]] {{LSL Param|ascending}}) ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t need to maintain the order of items (or want them sorted anyway), the following code is consistently about 2x faster on short lists, and 3-5x faster on lists with hundreds of items.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;list ListSortedAndUnique(list input, integer ascending) {&lt;br /&gt;
    input = llListSort(input, 1, ascending);&lt;br /&gt;
    integer index;&lt;br /&gt;
    list    last   = llList2List(input, 0, 0);&lt;br /&gt;
    list    result = last;&lt;br /&gt;
    for (index = 1 - llGetListLength(input); index &amp;lt; 0; ++index) {&lt;br /&gt;
        list current =  llList2List(input, index, index);&lt;br /&gt;
        if (llListFindList(current, last) &amp;lt; 0) {&lt;br /&gt;
            last    = current;&lt;br /&gt;
            result += last; &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{LSLC|Examples|ListUnique}}&lt;br /&gt;
{{LSLC|Examples|ListSortedAndUnique}}&lt;br /&gt;
[[Category:LSL_User-Defined Functions]]&lt;/div&gt;</summary>
		<author><name>Lachesis Ethereal</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ListUnique&amp;diff=1218482</id>
		<title>ListUnique</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ListUnique&amp;diff=1218482"/>
		<updated>2025-10-13T20:11:29Z</updated>

		<summary type="html">&lt;p&gt;Lachesis Ethereal: O(n log n) implementation (verified with real world tests)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}} __NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== Function: [[list]] ListUnique([[list]] {{LSL Param|lAll) }}; ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
Given a list of elements, strips out any duplicates in that list, and returns the de-duped list.&lt;br /&gt;
&lt;br /&gt;
See also: [[List|Lists]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
list ListUnique( list lAll ) {&lt;br /&gt;
    integer i;&lt;br /&gt;
    list lFiltered = llList2List(lAll, 0, 0);&lt;br /&gt;
    integer iAll = llGetListLength( lAll );&lt;br /&gt;
    for (i = 1; i &amp;lt; iAll; ++i) {&lt;br /&gt;
        if ( llListFindList(lFiltered, llList2List(lAll, i, i) ) == -1 ) {&lt;br /&gt;
            lFiltered += llList2List(lAll, i, i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return lFiltered;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
list mylist = ListUnique([&amp;quot;A&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;B&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
would return the list:&lt;br /&gt;
&lt;br /&gt;
[&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Originated in a November 2004 thread led by Chromal Brodsky in the SL Scripting Forum. http://forums-archive.secondlife.com/54/30/28137/1.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== Function: [[list]] ListSortedAndUnique([[list]] {{LSL Param|input}}, [[integer]] {{LSL Param|ascending}}) ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t need to maintain the order of items (or want them sorted anyway), the following code is consistently about 2x faster on short lists, and 3-5x faster on lists with hundreds of items.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;list ListSortedAndUnique(list input, integer ascending) {&lt;br /&gt;
    input = llListSort(input, 1, ascending);&lt;br /&gt;
    integer index;&lt;br /&gt;
    list    last   = llList2List(input, 1, 1);&lt;br /&gt;
    list    result = last;&lt;br /&gt;
    for (index = 1 - llGetListLength(input); index &amp;lt; 0; ++index) {&lt;br /&gt;
        list current =  llList2List(input, index, index);&lt;br /&gt;
        if (llListFindList(current, last) &amp;lt; 0) {&lt;br /&gt;
            last    = current;&lt;br /&gt;
            result += last; &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{LSLC|Examples|ListUnique}}&lt;br /&gt;
{{LSLC|Examples|ListSortedAndUnique}}&lt;br /&gt;
[[Category:LSL_User-Defined Functions]]&lt;/div&gt;</summary>
		<author><name>Lachesis Ethereal</name></author>
	</entry>
</feed>