to get started in your command line create a Console application with the old school main method
dotnet new console -n pav.sortedListExample --use-program-main
once you've created your console app, navigate into it with
cd pav.sortedListExample
after that open it in your ms code with
code .
Now Let's code up an example
using System.Collections;
namespace pc.SortedListExample
{
class Program
{
static void Main(string[] args)
{
SortedList sl = new SortedList();
sl.Add(3, "Three");
sl.Add(7, "Seven");
sl.Add(2, "Two");
sl.Add(6, 6.0);
sl.Add(4, 4);
sl.Add(5, "Five");
sl.Add(1, "One");
foreach (DictionaryEntry i in sl)
Console.WriteLine("{0}: {1}", i.Key, i.Value);
for (int i = 0; i < sl.Count; i++)
Console.WriteLine(sl[i]);
}
}
}
If it didn't then you would get an "Unhandled exception. System.InvalidOperationException: Failed to compare two elements in the array."
In this iteration, rather than using an int, I simply wrap an integer and do not implement the IComparable interface, resulting in an error.
using System.Collections;
namespace pc.SortedListExample
{
public class MyId //: IComparable
{
private static int runningId = 0;
public int Value { get; }
public MyId(){ Value = runningId++; }
public MyId(int value){ Value = value; }
// public int CompareTo(object? obj)
// {
// if(obj as MyId != null)
// return this.Value.CompareTo(((MyId)obj).Value);
// return 0;
// }
}
class Program
{
static void Main(string[] args)
{
SortedList sl = new SortedList();
sl.Add(new MyId(), "Three");
sl.Add(new MyId(), "Seven");
sl.Add(new MyId(), "Two");
sl.Add(new MyId(), 6.0);
sl.Add(new MyId(), 4);
sl.Add(new MyId(), "Five");
sl.Add(new MyId(), "One");
foreach (DictionaryEntry de in sl)
Console.WriteLine("{0}: {1}", ((MyId)de.Key).Value, de.Value);
for (int i = 0; i < sl.Count; i++)
Console.WriteLine(sl[new MyId(i)]);
}
}
}
To fix this all I simply have to do is implement the IComparable interface on myId class and everything will work again.
using System.Collections;
namespace pc.SortedListExample
{
public class MyId : IComparable
{
private static int runningId = 0;
public int Value { get; }
public MyId(){ Value = runningId++; }
public MyId(int value){ Value = value; }
public int CompareTo(object? obj)
{
if(obj as MyId != null)
return this.Value.CompareTo(((MyId)obj).Value);
return 0;
}
}
class Program
{
static void Main(string[] args)
{
SortedList sl = new SortedList();
sl.Add(new MyId(), "Three");
sl.Add(new MyId(), "Seven");
sl.Add(new MyId(), "Two");
sl.Add(new MyId(), 6.0);
sl.Add(new MyId(), 4);
sl.Add(new MyId(), "Five");
sl.Add(new MyId(), "One");
foreach (DictionaryEntry de in sl)
Console.WriteLine("{0}: {1}", ((MyId)de.Key).Value, de.Value);
for (int i = 0; i < sl.Count; i++)
Console.WriteLine(sl[new MyId(i)]);
}
}
}
Notice that we can either iterate using a foreach or display things using the index. Sorted lists work best with one type for your key, if your keys are made of different types then using a hashtable is more effective.