<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C# on AnanaSeek4Jam</title><link>https://ananasikdev.github.io/blog/tags/c%23/</link><description>Recent content in C# on AnanaSeek4Jam</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 25 Aug 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://ananasikdev.github.io/blog/tags/c%23/index.xml" rel="self" type="application/rss+xml"/><item><title>First attempt on island generator</title><link>https://ananasikdev.github.io/blog/p/unity_island_generator/</link><pubDate>Thu, 25 Aug 2022 00:00:00 +0000</pubDate><guid>https://ananasikdev.github.io/blog/p/unity_island_generator/</guid><description>&lt;img src="https://ananasikdev.github.io/blog/p/unity_island_generator/images/ImgIslands.jpg" alt="Featured image of post First attempt on island generator" />&lt;p>Recently I created a versatile system to generate islands in Unity and want to share my experience. There were technical issues, that are not so easy to solve, so I decided to describe the algorithm. There is no main code provided, because I just want to explain ways to fix some common problems, that may occur in many other projects, plus my code is not perfect for sure.&lt;/p>
&lt;h2 id="implementation">Implementation
&lt;/h2>&lt;br>
&lt;h3 id="stage-1--perlin-noise-as-a-base">&lt;strong>Stage 1 : Perlin noise as a base&lt;/strong>
&lt;/h3>&lt;p>I used usual Perlin Noise algorithm, conviently implemented in Unity in &lt;code>Mathf.PerlinNoise()&lt;/code> function. Basically, you use it with 2 parameters: x and y, and it returns value in this position. To have a randomly generated map each time you should shift your coordinates randomly.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Mathf&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">PerlinNoise&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="p">*&lt;/span> &lt;span class="n">noise&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">scale&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="n">noise&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">xOffset&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="p">*&lt;/span> &lt;span class="n">noise&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">scale&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="n">noise&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">yOffset&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>When the value in the specific point is greater than threshold, then it is ground, otherwise it&amp;rsquo;s water. The visualization describes this perfectly: peaks are islands, troughs are water.&lt;/p>
&lt;p>&lt;img src="https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgPerlinNoiseMap.png"
width="960"
height="540"
srcset="https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgPerlinNoiseMap_hu12b9f5972283a859ace2b3c9b126e3a3_249734_480x0_resize_box_3.png 480w, https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgPerlinNoiseMap_hu12b9f5972283a859ace2b3c9b126e3a3_249734_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="Perlin noise visualization"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
>
&lt;em>picture credit: &lt;a class="link" href="https://www.scratchapixel.com/lessons/procedural-generation-virtual-worlds/perlin-noise-part-2/perlin-noise-terrain-mesh" title="https://www.scratchapixel.com/lessons/procedural-generation-virtual-worlds/perlin-noise-part-2/perlin-noise-terrain-mesh"
target="_blank" rel="noopener"
>scratchapixel.com&lt;/a>&lt;/em>&lt;/p>
&lt;p>Let&amp;rsquo;s call this function &lt;code>IsGround(x, y) =&amp;gt; bool&lt;/code> for later.&lt;/p>
&lt;br>
&lt;h3 id="stage-2--islands-detection">&lt;strong>Stage 2 : Islands detection&lt;/strong>
&lt;/h3>&lt;p>Initially I should mention, that we have a main loop function, that passes through the whole map and tries to detect islands.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="p">&amp;lt;&lt;/span> &lt;span class="n">worldWidth&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">++)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="p">&amp;lt;&lt;/span> &lt;span class="n">worldWidth&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">j&lt;/span>&lt;span class="p">++)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">islandIds&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">j&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="p">==&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="p">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">IsGround&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">j&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GenerateIsland&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">islandIds&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">j&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>For the optimization I needed to distinguish islands (I will reveal it a bit further). We have a matrix, where every &lt;code>(x, y)&lt;/code> pair (tile coords) is attached to int. It represents the map of detected islands&amp;rsquo; indicies. Basically, one function recieves x and y coordinates and checks using matrix, whether there is no island already detected there. If so, it runs &lt;code>GetIslandTiles&lt;/code> function to get coords of all tiles that correspond to this island. It works recursively checking all positions around current and stops, when all calls get completed.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">private&lt;/span> &lt;span class="k">void&lt;/span> &lt;span class="n">GenerateIsland&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">[,]&lt;/span> &lt;span class="n">islandIds&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">j&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">List&lt;/span>&lt;span class="p">&amp;lt;(&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">)&amp;gt;&lt;/span> &lt;span class="n">tiles&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="p">&amp;lt;(&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">)&amp;gt;();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// GetIslandTiles writes all island&amp;#39;s tiles into tiles list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GetIslandTiles&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">islands&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Count&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tiles&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">islandIds&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">j&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// islands is a list of lists of position, so basically the list of islands&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">islands&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tiles&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// wait for it&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="kt">float&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">xSize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">ySize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="n">minX&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="n">minY&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">CalculateTextureRect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tiles&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GenerateIslandSprite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GenerateIslandTexture&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tiles&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">xSize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ySize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">minX&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">minY&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>With this working I have access to manipulate each island separately. For example, I set up a filter to remove too small islands to achieve more natural look and better playing experience by checking tiles. Count value is greater than threshold.&lt;/p>
&lt;br>
&lt;h3 id="stage-3--texture-generation">&lt;strong>Stage 3 : Texture generation&lt;/strong>
&lt;/h3>&lt;p>On the first attempt I instantiated all tiles, which are ground and got the final visual of floating islands. However, this process lasted for a few minutes and the performance was unplayably bad. The main problem was not the amount of triangles but the amount of batches. There were too many objects in the scene, so processor sends tons of requests to videocard and it takes very long time.&lt;/p>
&lt;p>The first obvious solution was to enable static batching in the game. But these objects have been generated in runtime, so there was no way to apply static batching on them, but dynamic. However, dynamic batching does its work not so well with that count of objects and I was not happy with that.&lt;/p>
&lt;p>This is why I decided to extend my system not just to instantiate tiles but to add thier sprites to island&amp;rsquo;s texture. This reduces the overall count of objects hundred times which provides perfect performance even for a huge map.&lt;/p>
&lt;p>This is the algorithm of creating island&amp;rsquo;s texture:
Create a function &lt;code>AddImage2Texture&lt;/code> that adds sprite to a certain local position with alpha (if you have isometric map, you have to use alpha). The issue is that
&lt;code>Texture2D.SetPixels()&lt;/code> do not add sprites, but override them. So it makes it impossible to add images with alpha channel native way. This function is designed to actually add images to the texture. Basically, it runs through the sprite you want to add and if it detects transparent pixel, then it replaces it with the correspond pixel on the texture on the same global textures. So it takes the pixel from underneath it and puts right into current sprite. With this magic done it overrides target texture spot with the new one.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// colors is basically the texture you add to tex (basic texture of island)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">private&lt;/span> &lt;span class="k">void&lt;/span> &lt;span class="n">AddImage2Texture&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Texture2D&lt;/span> &lt;span class="n">tex&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Color&lt;/span>&lt;span class="p">[]&lt;/span> &lt;span class="n">colors&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Vector2Int&lt;/span> &lt;span class="n">imagePosition&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Array of all tex pixels&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Color&lt;/span>&lt;span class="p">[]&lt;/span> &lt;span class="n">_colors&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Color&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">colors&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Length&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// go through all pixels&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="p">&amp;lt;&lt;/span> &lt;span class="n">colors&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Length&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">++)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// If pixel is transparent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Mathf&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Approximately&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">colors&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Here we calculate position of current pixel on the tex. This pixel is placed right under current one.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">imagePosition&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="p">%&lt;/span> &lt;span class="n">tileSize&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">imagePosition&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="p">/&lt;/span> &lt;span class="n">tileSize&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">_colors&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">tex&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">GetPixel&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">_colors&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">colors&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// At this stage _colors does not have any transparent pixels and we can hardly rewrite this set of pixel on our texture.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tex&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SetPixels&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">imagePosition&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">imagePosition&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tileSize&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tileSize&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">_colors&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>We go through all tiles&amp;rsquo; positions and apply sprites into the texture using &lt;code>AddImage2Texture&lt;/code> function.&lt;/p>
&lt;p>If you have isometric geometry, then you need also to write function to convert matrix position to isometric position like this:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Takes int matrix position and returns appropriate isometric position&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">public&lt;/span> &lt;span class="kd">static&lt;/span> &lt;span class="n">Vector2&lt;/span> &lt;span class="n">ConvertPosition&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Vector2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="p">/&lt;/span> &lt;span class="m">2f&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br>
&lt;h3 id="combining-all-together">&lt;strong>Combining all together&lt;/strong>
&lt;/h3>&lt;p>In this snipped of code from &lt;strong>Stage 2&lt;/strong> I mentioned &lt;code>CalculateTextureRect&lt;/code> and &lt;code>GenerateIslandSprite&lt;/code> functions. Let&amp;rsquo;s have a look on those.&lt;/p>
&lt;blockquote>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="n">islands&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tiles&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// wait for it&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="kt">float&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">xSize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">ySize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="n">minX&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">float&lt;/span> &lt;span class="n">minY&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">CalculateTextureRect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tiles&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GenerateIslandSprite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GenerateIslandTexture&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tiles&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">xSize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ySize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">minX&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">minY&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/blockquote>
&lt;h4 id="calculatetexturerect">&lt;strong>CalculateTextureRect&lt;/strong>
&lt;/h4>&lt;p>This function calculates bounds and position of a texture. It inputs a list of &lt;code>(int, int)&lt;/code> pairs, which are tiles&amp;rsquo; positions on an island. Firstly we define minX and maxX values, which are basically the boundaries of texture by X axis. This is how it works:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">float&lt;/span> &lt;span class="n">minX&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">tiles&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Min&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pos&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="n">ConvertPosition&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pos&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Item1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pos&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Item2&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>And so on for other 3 parameters (maxX, minY, maxY).
Then we use them to calculate width and height of texture and also coordinates x and y.&lt;/p>
&lt;h4 id="generateislandsprite">&lt;strong>GenerateIslandSprite&lt;/strong>
&lt;/h4>&lt;p>This is a very basic function that instantiates a gameobject and applies the input texture to it through &lt;code>SpriteRenderer&lt;/code>&lt;/p>
&lt;br>
&lt;h3 id="stage-4--extensions">&lt;strong>Stage 4 : Extensions&lt;/strong>
&lt;/h3>&lt;details>
&lt;summary> Applying island size threshold &lt;/summary>
&lt;blockquote>
&lt;p>&lt;em>I have access to manipulate each island separately. For example, I set up a filter to remove too small islands to achieve more natural look and better playing experience by checking tiles. Count value is greater than threshold. *Stage 2&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;p>&lt;code>tiles.Count&lt;/code> field provides information about area of an island.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">tiles&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Count&lt;/span> &lt;span class="p">&amp;lt;=&lt;/span> &lt;span class="n">threscholdIslandSize&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/details>
&lt;details>
&lt;summary> Creating light outline for islands &lt;/summary>
&lt;p>One can use perlin noise to detect whether the certain position on the map is shallow water and make these spots lighter to achieve realistic water appearance.&lt;/p>
&lt;/details>
&lt;details>
&lt;summary> Procedural generation &lt;/summary>
&lt;p>This algorithm can be adapted to support procedural world generation.
Set up generating islands in a certain chunk but instead of cutting off excess parts that are out of world&amp;rsquo;s border let them spawn entirely for better visual and preventing algorithm from glitches of generating same islands for several times unnecessary.&lt;/p>
&lt;/details>
&lt;hr>
&lt;h2 id="some-statistics">&lt;strong>Some statistics&lt;/strong>
&lt;/h2>&lt;p>I ran my generator with different settings on my laptop and put results in the table:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:center">№&lt;/th>
&lt;th style="text-align:left">world width&lt;/th>
&lt;th style="text-align:left">world area&lt;/th>
&lt;th style="text-align:center">time(s)&lt;/th>
&lt;th style="text-align:center">GC alloc (MB)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:center">1&lt;/td>
&lt;td style="text-align:left">$1*10^2$&lt;/td>
&lt;td style="text-align:left">$1.0*10^4$&lt;/td>
&lt;td style="text-align:center">1.285&lt;/td>
&lt;td style="text-align:center">46.9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">2&lt;/td>
&lt;td style="text-align:left">$1*10^2$&lt;/td>
&lt;td style="text-align:left">$1.0*10^4$&lt;/td>
&lt;td style="text-align:center">1.285&lt;/td>
&lt;td style="text-align:center">46.9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">3&lt;/td>
&lt;td style="text-align:left">$2*10^2$&lt;/td>
&lt;td style="text-align:left">$4.0*10^4$&lt;/td>
&lt;td style="text-align:center">2.230&lt;/td>
&lt;td style="text-align:center">238.6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">4&lt;/td>
&lt;td style="text-align:left">$2*10^2$&lt;/td>
&lt;td style="text-align:left">$4.0*10^4$&lt;/td>
&lt;td style="text-align:center">2.144&lt;/td>
&lt;td style="text-align:center">238.6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">5&lt;/td>
&lt;td style="text-align:left">$3*10^2$&lt;/td>
&lt;td style="text-align:left">$9.0*10^4$&lt;/td>
&lt;td style="text-align:center">4.498&lt;/td>
&lt;td style="text-align:center">522.2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">6&lt;/td>
&lt;td style="text-align:left">$3*10^2$&lt;/td>
&lt;td style="text-align:left">$9.0*10^4$&lt;/td>
&lt;td style="text-align:center">4.562&lt;/td>
&lt;td style="text-align:center">522.2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">7&lt;/td>
&lt;td style="text-align:left">$4*10^2$&lt;/td>
&lt;td style="text-align:left">$1.6*10^5$&lt;/td>
&lt;td style="text-align:center">9.645&lt;/td>
&lt;td style="text-align:center">983.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">8&lt;/td>
&lt;td style="text-align:left">$4*10^2$&lt;/td>
&lt;td style="text-align:left">$1.6*10^5$&lt;/td>
&lt;td style="text-align:center">9.261&lt;/td>
&lt;td style="text-align:center">983.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">9&lt;/td>
&lt;td style="text-align:left">$5*10^2$&lt;/td>
&lt;td style="text-align:left">$2.5*10^5$&lt;/td>
&lt;td style="text-align:center">14.191&lt;/td>
&lt;td style="text-align:center">1495.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">10&lt;/td>
&lt;td style="text-align:left">$5*10^2$&lt;/td>
&lt;td style="text-align:left">$2.5*10^5$&lt;/td>
&lt;td style="text-align:center">13.879&lt;/td>
&lt;td style="text-align:center">1495.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">11&lt;/td>
&lt;td style="text-align:left">$1*10^3$&lt;/td>
&lt;td style="text-align:left">$1.0*10^6$&lt;/td>
&lt;td style="text-align:center">56.295&lt;/td>
&lt;td style="text-align:center">2160.6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">12&lt;/td>
&lt;td style="text-align:left">$1*10^3$&lt;/td>
&lt;td style="text-align:left">$1.0*10^6$&lt;/td>
&lt;td style="text-align:center">55.526&lt;/td>
&lt;td style="text-align:center">2160.6&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Each test was repeated twice for better accuracy. With the &lt;code>noise scale&lt;/code> parameter equals to &lt;code>0.04&lt;/code> and &lt;code>noise threshold&lt;/code> to &lt;code>0.65&lt;/code> ground density is &lt;code>13.667%&lt;/code>.&lt;/p>
&lt;p>This statistics was gathered with unity profiler by wrapping generation code with &lt;code>UnityEngine.Profiling.Profiler.BeginSample()&lt;/code> and &lt;code>UnityEngine.Profiling.Profiler.EndSample()&lt;/code>&lt;/p>
&lt;p>&lt;strong>My hardware:&lt;/strong>
RAM: 16 GB
Processor: AMD Ryzen 5 3550H x64
OS: Windows 10 Home 64-bit&lt;/p>
&lt;hr>
&lt;h2 id="screenshots">Screenshots
&lt;/h2>&lt;p>&lt;img src="https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgIslandsWorld100.jpg"
width="1133"
height="1097"
srcset="https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgIslandsWorld100_hu38556d5f7e3bc4e026890cb6e24204e9_112929_480x0_resize_q75_box.jpg 480w, https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgIslandsWorld100_hu38556d5f7e3bc4e026890cb6e24204e9_112929_1024x0_resize_q75_box.jpg 1024w"
loading="lazy"
alt="Result image 100w"
class="gallery-image"
data-flex-grow="103"
data-flex-basis="247px"
>
&lt;img src="https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgIslandsWorld200.jpg"
width="1095"
height="1193"
srcset="https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgIslandsWorld200_hu7a642caabbac261d0d3a8074eab71ddf_140232_480x0_resize_q75_box.jpg 480w, https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgIslandsWorld200_hu7a642caabbac261d0d3a8074eab71ddf_140232_1024x0_resize_q75_box.jpg 1024w"
loading="lazy"
alt="Result image 200w"
class="gallery-image"
data-flex-grow="91"
data-flex-basis="220px"
>&lt;/p>
&lt;p>&lt;img src="https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgIslandsWorld.jpg"
width="1019"
height="1202"
srcset="https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgIslandsWorld_hu1a63aa04461c45376f69169ddba3a741_239546_480x0_resize_q75_box.jpg 480w, https://ananasikdev.github.io/blog/blog/p/unity_island_generator/images/ImgIslandsWorld_hu1a63aa04461c45376f69169ddba3a741_239546_1024x0_resize_q75_box.jpg 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="84"
data-flex-basis="203px"
>&lt;/p>
&lt;hr>
&lt;h2 id="credits">Credits
&lt;/h2>&lt;p>&lt;a class="link" href="https://www.scratchapixel.com/lessons/procedural-generation-virtual-worlds/perlin-noise-part-2/perlin-noise-terrain-mesh" target="_blank" rel="noopener"
>https://www.scratchapixel.com/lessons/procedural-generation-virtual-worlds/perlin-noise-part-2/perlin-noise-terrain-mesh&lt;/a>&lt;/p>
&lt;h2 id="about-project">About project
&lt;/h2>&lt;p>I am developing tower-defence game about resource collection and processing automatization and defence management. Player needs to build up his base entirely on islands to gather resources and fight out enemies. It seems quite similar to Mindustry.&lt;/p></description></item><item><title>C# Boost</title><link>https://ananasikdev.github.io/blog/p/csharp_boost/</link><pubDate>Wed, 04 Nov 2020 00:00:00 +0000</pubDate><guid>https://ananasikdev.github.io/blog/p/csharp_boost/</guid><description>&lt;h2 id="disclaimer">Disclaimer
&lt;/h2>&lt;p>&lt;em>My first ever project in C# with (some) documentation and (some) SOLID. The code is funny, my English is relaxed, my confidence high; still, it was precious. It was back in 2020 when I was switching from Python to C# with some assistance, which really helped me push through the initial phase rather quickly. [2026-04-09]&lt;/em>&lt;/p>
&lt;hr>
&lt;p>&lt;a class="link" href="https://github.com/AnanasikDev/BoostLibrary" target="_blank" rel="noopener"
>Github repo&lt;/a>&lt;/p>
&lt;h2 id="documentation">Documentation
&lt;/h2>&lt;p>If You are c# coder and wanna work more effective - you may use my library.&lt;/p>
&lt;p>I do and I will upgrade it, so you can use the latest version with fixed bugs/added new features.&lt;/p>
&lt;p>Contributing is the good help and motivation for me to make your code more simpless and readable.&lt;/p>
&lt;h3 id="what-can-this-lib-do">What can this lib do?
&lt;/h3>&lt;p>This lib can simplifie working with collections like list I called Liars &amp;amp; random numbers, collections generators, etc.. More details below.&lt;/p>
&lt;h3 id="examples">Examples
&lt;/h3>&lt;h4 id="class-liar">Class Liar
&lt;/h4>&lt;p>Collection, that works really like list, but has more functionality&lt;/p>
&lt;p>Insert &amp;amp; remove collections/items, sort, pop, replace and a lot of other funcs.&lt;/p>
&lt;h4 id="class-range">Class Range
&lt;/h4>&lt;p>Collection generator&lt;/p>
&lt;p>Generates number-filled Liar with some settings. Useful thing)&lt;/p>
&lt;h4 id="class-randomer">Class Randomer
&lt;/h4>&lt;p>Random nums generator&lt;/p>
&lt;p>Generates few (or probably one) random numbers. It also can choose item, mix collection and other things, that you missed in default Random)&lt;/p>
&lt;h4 id="class-number">Class Number
&lt;/h4>&lt;p>Holds value, that can be anyone number type. It contains int, float, decimal and so on types.&lt;/p>
&lt;p>Really useful. It is used in almost whole of library functions.&lt;/p>
&lt;h4 id="static-class-num">Static Class Num
&lt;/h4>&lt;p>Adding some new functions for Number. For example - numsAfterPoint, numsBeforePoint, Pow, Root and other.&lt;/p>
&lt;h4 id="static-class-round">Static Class Round
&lt;/h4>&lt;p>Adding new rounding functions.&lt;/p>
&lt;h4 id="class-set">Class Set
&lt;/h4>&lt;p>Holds liar, that has only unique items. Has some functions from liar.&lt;/p>
&lt;details>&lt;summary>&lt;strong>Range in details&lt;/strong>&lt;/summary>&lt;p>
&lt;p>The most simple example:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">myRange&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">10&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">myRange&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>or&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Range&lt;/span> &lt;span class="n">myRange&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">10&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">myRange&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>The different is Liar has functions, that does not have Range. If you have Range obj you can get next/prev item etc.; working with liar
gives some other features. So, it is your choose, what whould you use in here.&lt;/p>
&lt;p>Example with end &amp;lt; start and step &amp;lt; 0.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">myRange&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">15&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="m">5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//It whould create reversed Range&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">myRange&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>You also may use your func to change value on the each range iteration:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Number&lt;/span> &lt;span class="n">CurrentValue&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//This var we are changing at the each range iteration&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Range&lt;/span> &lt;span class="n">RangeObject&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="n">ToRound&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">valueStruct&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">FuncANDArgs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SomeFunc&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//Here we are creating one Range object&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RangeObject&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//FuncANDArgs is a struct in Utils that contains func, args(if you need) &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//and bool var Firstly(if true then func workes before changing value; else after)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">dynamic&lt;/span> &lt;span class="n">SomeFunc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">dynamic&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CurrentValue&lt;/span> &lt;span class="p">*=&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">CurrentValue&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Result:&lt;/p>
&lt;pre>&lt;code>2 4 8 16 32 64 128 256 512
&lt;/code>&lt;/pre>
&lt;p>But here range starts from 2 - this is because of Firstly (writed before) is true (default value)&lt;/p>
&lt;p>If we whould change Firstly to false this whould be fixed:&lt;/p>
&lt;pre>&lt;code>1 2 4 8 16 32 64 128 256
&lt;/code>&lt;/pre>
&lt;p>If you didn`t understand:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">valueStruct&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">FuncANDArgs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SomeFunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">&amp;lt;-&lt;/span> &lt;span class="n">right&lt;/span> &lt;span class="n">line&lt;/span> &lt;span class="p">:&lt;/span>&lt;span class="n">D&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>You also may create function returns random number for valueStruct:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="n">SomeFunc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">object&lt;/span>&lt;span class="p">[]&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Randomer&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Randomer&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Rand&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">10&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">//start, end, step=1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Using this func make your Range object filled by random nums&lt;/p>
&lt;p>There are some usefull operators:&lt;/p>
&lt;p>++; Appends next item&lt;/p>
&lt;p>&amp;ndash;; Removes last item&lt;/p>
&lt;p>+, * Appending collection/item, mults range n times&lt;/p>
&lt;p>and so on&lt;/p>
&lt;p>Arguments type is Number&lt;/p>
&lt;p>PS: I`m sorry, that name of Range class is familiar to System.Range&lt;/p>
&lt;/p>&lt;/details>
&lt;details>&lt;summary>&lt;strong>Randomer in depth&lt;/strong>&lt;/summary>&lt;p>
&lt;details>&lt;summary>&lt;strong>Let`s start!&lt;/strong>&lt;/summary>&lt;p>
&lt;p>For the start you should create one Randomer`s object:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Randomer&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Randomer&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>You can put start &amp;amp; end values as args when you create object:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Randomer&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Randomer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">3&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// -&amp;gt; third argument is step. Now you will get random nums that multiplies 3.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Yeah, there is a fourth arg, that means count. Count default value = 1, so you`ll get one rnd number.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Randomer&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Randomer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">4&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// -&amp;gt; now you`ll get four rnd numbers.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>All methods, those names have prefix &amp;ldquo;Fast&amp;rdquo; are static.&lt;/p>
&lt;/p>&lt;/details>
&lt;details>&lt;summary>&lt;strong>Rand()&lt;/strong>&lt;/summary>&lt;p>
Next step - is creating nums, because we haven`t do it yet.
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">number&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Rand&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0.001&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">10.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">4.01f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">7&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">//Creating some numbers&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>As you can see, this function can generate random numbers use input arguments&lt;/p>
&lt;p>of all number-types (int, decimal, float, short, etc.)&lt;/p>
&lt;p>If you need to create nums in loop, you may write your new params in Rand func
instead of change r`s fields in each iteration, you should:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="p">&amp;lt;&lt;/span> &lt;span class="m">3&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">_&lt;/span>&lt;span class="p">++)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">//Some code..&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Number&lt;/span> &lt;span class="n">number&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">RandOne&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">4&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">//Some code..&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/p>&lt;/details>
&lt;details>&lt;summary>&lt;strong>CollectionRandMix()&lt;/strong>&lt;/summary>&lt;p>
&lt;p>If you need to mix you collection - use this func!&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Randomer&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Randomer&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">something&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">something&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">RandMix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">something&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">something&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Here you`ll get you Liar mixed. It is so usefull))&lt;/p>
&lt;/p>&lt;/details>
&lt;details>&lt;summary>&lt;strong>CollectionRandChoose()&lt;/strong>&lt;/summary>&lt;p>
&lt;p>Use this to get random item from your collection.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Randomer&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Randomer&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">something&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="n">count&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="m">4&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">items&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">RandChoose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">something&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">count&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">items&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Here you are!&lt;/p>
&lt;/p>&lt;/details>
&lt;/p>&lt;/details>
&lt;details>&lt;summary>&lt;strong>Liar&lt;/strong>&lt;/summary>&lt;p>
&lt;details>&lt;summary>&lt;strong>Start!&lt;/strong>&lt;/summary>&lt;p>
&lt;p>Firstly, we should create new object:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">myLiar&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">&amp;gt;();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>If you wanna put some items into Liar by easy way:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">myLiar&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">&amp;gt;()&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">3&lt;/span> &lt;span class="p">};&lt;/span> &lt;span class="c1">//Just put your items here, like you do it with List&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>or create the same one by another way:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">myLiar&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">&amp;gt;(&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">3&lt;/span> &lt;span class="p">);&lt;/span> &lt;span class="c1">//Result is same as previously&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>You also can remove, append, pop, get items, sort by lots of rules, concatenate and multiply, reverse, replace items and other functions. Try it!&lt;/p>
&lt;/p>&lt;/details>
&lt;details>&lt;summary>&lt;strong>Appending &amp; Inserting&lt;/strong>&lt;/summary>&lt;p>
&lt;p>The same thing to Lists.&lt;/p>
&lt;p>.Append(item) - appends item to end;&lt;/p>
&lt;p>.Add(item) - the same one to Append;&lt;/p>
&lt;p>.AppendCollection(collection) - appends collection to end;&lt;/p>
&lt;p>.Insert(item, index) - inserts item to index;&lt;/p>
&lt;p>.InsertCollection(collection, index) - inserts collection to index;&lt;/p>
&lt;p>.Prepend(item) - adds item to start.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> &amp;gt;&amp;gt;&amp;gt; 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Insert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">3&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">//if collection is empty - index=0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> &amp;gt;&amp;gt;&amp;gt; 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;()&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">3&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;()&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="m">6&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">3&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">InsertCollection&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> &amp;gt;&amp;gt;&amp;gt; 1 6 5 3 2 3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/p>&lt;/details>
&lt;details>&lt;summary>&lt;strong>Removing&lt;/strong>&lt;/summary>&lt;p>
&lt;p>.Remove(item) - removes first item;&lt;/p>
&lt;p>.RemoveAt(index) - removes liar[index];&lt;/p>
&lt;p>.RemoveAt(index, count) - removes all from index count times;&lt;/p>
&lt;p>.RemoveRange(start, end, step) - removes range;&lt;/p>
&lt;p>.RemoveAtIndecies(indecies) - removes items at all indecies;&lt;/p>
&lt;p>.RemoveCollection(collection) - removes all item that liar collection have;&lt;/p>
&lt;p>.RemoveAll(item) - removes all items;&lt;/p>
&lt;p>.RemoveAll() - clears;&lt;/p>
&lt;p>.RemoveAll(function) - removes all items function(item) == true;&lt;/p>
&lt;p>.RemoveFirst(item) - the same to regular remove;&lt;/p>
&lt;p>.RemoveFirst() - removes first;&lt;/p>
&lt;p>.RemoveFirst(function) - removes first item function(item) == true;&lt;/p>
&lt;p>.RemoveLast(item) - removes last item;&lt;/p>
&lt;p>.RemoveLast() - removes last;&lt;/p>
&lt;p>.RemoveLast(function) - removes last item function(item) == true;&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;()&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">3&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Remove&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> &amp;gt;&amp;gt;&amp;gt; 1, 3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;()&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">3&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">RemoveAt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> &amp;gt;&amp;gt;&amp;gt; 2, 3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">RemoveAtIndecies&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> &amp;gt;&amp;gt;&amp;gt; 1, 3, 4, 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/p>&lt;/details>
&lt;details>&lt;summary>&lt;strong>Replacing&lt;/strong>&lt;/summary>&lt;p>
&lt;p>.ReplaceAll(oldValue, newValue) - replaces all items equal oldValue for newValue;&lt;/p>
&lt;p>.ReplaceSome(oldValue, newValue, count) - replaces count entries of oldValue for newValue;&lt;/p>
&lt;p>.ReplaceSome(oldValue, newValue, count, start) - replaces all items equal oldValue for newValue from start to start + count;&lt;/p>
&lt;p>.ReplaceFirst(oldValue, newValue) - replaces first item equals oldValue for newValue;&lt;/p>
&lt;p>.ReplaceLast(oldValue, newValue) - replaces last item equals oldValue for newValue;&lt;/p>
&lt;p>.ReplaceInRange(oldValue, newValue, start, end) - replaces all items equal oldValue for newValue in range;&lt;/p>
&lt;p>.ReplaceAllCollection(oldValues, newValues) - replaces all entries of items from oldValues for newValues;&lt;/p>
&lt;p>.ReplaceSomeCollection(oldValues, newValues, count) - replaces count entries of items from oldValues for newValues;&lt;/p>
&lt;p>.ReplaceSomeCollection(oldValues, newValues, start, end) - replaces all entries of all items from oldValues for newValues in range;&lt;/p>
&lt;p>.ReplaceFirstCollection(oldValues, newValues) - replaces first entry of all items from oldValues for newValues;&lt;/p>
&lt;p>.ReplaceLastCollection(oldValues, newValues) - replaces last entry of all items from oldValues for newValues;&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">SomeCol&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;()&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">7&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SomeCol&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">SomeCol&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">ReplaceFirst&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">9&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> &amp;gt;&amp;gt;&amp;gt; 0, 1, 6, 9, 7
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">SomeCol&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;()&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SomeCol&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">SomeCol&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">ReplaceAll&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">9&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> &amp;gt;&amp;gt;&amp;gt; 9 1 6 9 7 9 4 9
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/p>&lt;/details>
&lt;details>&lt;summary>&lt;strong>Sorting functions!&lt;/strong>&lt;/summary>&lt;p>
&lt;p>Library has the one and very-very effective algorithm - is called &lt;em>&amp;ldquo;Fast sorting&amp;rdquo;&lt;/em>
Yeah, it`s pretty obvious that this function is fast))
This functionality is owned by class Sorter.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">Number&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">myLiar&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">myLiar&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Sorter&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">QuickSort&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">myLiar&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Result:&lt;/p>
&lt;pre>&lt;code>8 6 4 2 0
0 2 4 6 8
&lt;/code>&lt;/pre>
&lt;p>First line - is raw liar; Second - sorted&lt;/p>
&lt;p>String sorting!&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cs" data-lang="cs">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="kt">string&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">l&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Liar&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="kt">string&lt;/span>&lt;span class="p">&amp;gt;()&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s">&amp;#34;Awake&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Honey&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Oak&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Bike&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Wizard&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;USA&amp;#34;&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Sorter&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">QuickSort&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SortingMode&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">STRINGcharGREATER&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>SortingMode modes:&lt;/p>
&lt;p>*GREATER, greater nums&lt;/p>
&lt;p>*LESS, less nums&lt;/p>
&lt;p>*EQALS, nothing changes&lt;/p>
&lt;p>*RANDOM, random mixing&lt;/p>
&lt;p>*STRINGlenGREATER, greater length&lt;/p>
&lt;p>*STRINGlenLESS, less length&lt;/p>
&lt;p>*STRINGcharGREATER, greater char in string num&lt;/p>
&lt;p>*STRINGcharLESS, less char int string num&lt;/p>
&lt;p>*CHARGREATER, greater char num by right&lt;/p>
&lt;p>*CHARLESS less char num by right&lt;/p>
&lt;/p>&lt;/details>
&lt;/p>&lt;/details>
&lt;p>project started at 24.08.2020&lt;/p></description></item></channel></rss>