Advertisement
elena1234

Create Custom List<T>

Feb 13th, 2021 (edited)
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.74 KB | None | 0 0
  1. using System;
  2. using System.Text;
  3.  
  4. namespace CreateCustomList
  5. {
  6.     public class CustomList<T>
  7.     {
  8.         private const int InitialCapacity = 2;
  9.         private T[] elementsInTheList;
  10.         private int currentCapacity;
  11.  
  12.         public CustomList()
  13.         {
  14.             elementsInTheList = new T[InitialCapacity];
  15.             currentCapacity = InitialCapacity;
  16.         }
  17.  
  18.         public CustomList(int capacity)
  19.         {
  20.             elementsInTheList = new T[capacity];
  21.             currentCapacity = capacity;
  22.         }
  23.  
  24.         public int Count { get; private set; }
  25.  
  26.         private void ShiftToRight(int index, T itemToInsert)
  27.         {
  28.             for (int i = this.Count; i > index; i--)
  29.             {
  30.                 this.elementsInTheList[i] = this.elementsInTheList[i - 1];
  31.             }
  32.             this.elementsInTheList[index] = itemToInsert;
  33.         }
  34.  
  35.         private void Shrink()
  36.         {
  37.             T[] newArray = new T[currentCapacity / 2];
  38.             for (int i = 0; i < this.Count; i++)
  39.             {
  40.                 newArray[i] = this.elementsInTheList[i];
  41.             }
  42.             currentCapacity = newArray.Length;
  43.             this.elementsInTheList = newArray;
  44.         }
  45.  
  46.         private void ShiftToLeft(int index)
  47.         {
  48.             for (int i = index; i < this.Count - 1; i++)
  49.             {
  50.                 this.elementsInTheList[i] = this.elementsInTheList[i + 1];
  51.             }
  52.             this.elementsInTheList[this.Count - 1] = default;
  53.         }
  54.  
  55.         private void ValidateIndex(int index)
  56.         {
  57.             if (index < 0 || index >= Count)
  58.             {
  59.                 throw new Exception("Index is invalid!");
  60.             }
  61.         }
  62.  
  63.         private void ResizeTheArray()
  64.         {
  65.             T[] newArray = new T[2 * currentCapacity];
  66.             for (int i = 0; i < this.Count; i++)
  67.             {
  68.                 newArray[i] = this.elementsInTheList[i];
  69.             }
  70.             this.Count++;
  71.             currentCapacity = newArray.Length;
  72.             this.elementsInTheList = newArray;
  73.         }
  74.  
  75.         public T this[int index]
  76.         {
  77.             get
  78.             {
  79.                 ValidateIndex(index);
  80.                 return this.elementsInTheList[index];
  81.             }
  82.             set
  83.             {
  84.                 ValidateIndex(index);
  85.                 this.elementsInTheList[index] = value;
  86.             }
  87.         }
  88.  
  89.         public void Add(T element)
  90.         {
  91.             if (this.Count + 1 > currentCapacity)
  92.             {
  93.                 ResizeTheArray();
  94.                 this.elementsInTheList[this.Count - 1] = element;
  95.             }
  96.  
  97.             else
  98.             {
  99.                 this.Count++;
  100.                 this.elementsInTheList[this.Count - 1] = element;
  101.             }
  102.         }
  103.  
  104.         public void RemoveAt(int index)
  105.         {
  106.             ValidateIndex(index);
  107.             ShiftToLeft(index);
  108.             this.Count--;
  109.             if (this.Count <= this.elementsInTheList.Length / 4)
  110.             {
  111.                 Shrink();
  112.             }
  113.         }
  114.  
  115.         public void Insert(int index, T item)
  116.         {
  117.             if (index < 0 || index > this.Count)
  118.             {
  119.                 throw new Exception("Index is invalid!");
  120.             }
  121.  
  122.             if (index == this.Count)
  123.             {
  124.                 Add(item); // call Resize
  125.             }
  126.  
  127.             else if (this.Count + 1 > currentCapacity)
  128.             {
  129.                 ResizeTheArray();
  130.                 ShiftToRight(index, item);
  131.                 this.Count++;
  132.             }
  133.             else
  134.             {
  135.                 ShiftToRight(index, item);
  136.                 this.Count++;
  137.             }
  138.         }
  139.  
  140.         public bool Contains(int element)
  141.         {
  142.             foreach (var item in this.elementsInTheList)
  143.             {
  144.                 if (item.Equals(element))
  145.                 {
  146.                     return true;
  147.                 }
  148.             }
  149.  
  150.             return false;
  151.         }
  152.  
  153.         public void Swap(int firstIndex, int secondIndex)
  154.         {
  155.             ValidateIndex(firstIndex);
  156.             ValidateIndex(secondIndex);
  157.             var firstElement = this.elementsInTheList[firstIndex];
  158.             this.elementsInTheList[firstIndex] = this.elementsInTheList[secondIndex];
  159.             this.elementsInTheList[secondIndex] = firstElement;
  160.         }
  161.  
  162.         public override string ToString()
  163.         {
  164.             var sb = new StringBuilder();
  165.             for (int i = 0; i < this.Count; i++)
  166.             {
  167.                string item = this.elementsInTheList[i].ToString();
  168.                sb.Append(item + " ");
  169.             }
  170.            
  171.             return sb.ToString().Remove(sb.Length - 1, 1);
  172.         }
  173.     }
  174. }
  175.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement