Podobnie jak delegaty: Predicate, Converter - delegata Comparsion istnieje głównie po to, by dać możliwość kolekcjom Array i List<T> możliwość sortowania.
Obecnie jednak nie korzystam z metody Sort, tylko z metody LINQ OrderBy.
Używanie delegaty tak, jak w poprzednich przypadkach nie ma sensu. Sama delegata istnieje dla metod np. Sort.
Delegata jest zdefiniowana następująco.
public delegate int Comparison<in T>(T x, T y);
Metoda referowana do tej delegaty musi przyjmować dwa parametry jednego typu i tego samego typu zwracać wartość.
W metodzie Sort C# na podstawie twojej podanej metody posortuje elementy kolekcji.
using System;
using System.Collections.Generic;
namespace ConsoleApplication_CSharpFun
{
class Program
{
public static void Main(string[] args)
{
List<int> collection = new List<int>();
collection.Add(202);
collection.Add(270);
collection.Add(310);
collection.Add(910);
collection.Add(430);
collection.Add(18);
collection.Add(130);
collection.Sort(Program.CompareWithCase);
foreach (Int32 s in collection)
Console.WriteLine(s);
}
public static int CompareWithCase(int i1, int i2)
{
return i1.ToString().CompareTo(i2.ToString());
}
}
}
W przykładzie powyżej liczby zostaną posortowane wg ich kolejności alfanumerycznej napisu.
W C# 3.0 mamy LINQ i wyrażenia lambda, oznacza to, że wyrażenie powyżej można skrócić do poniższego zapisu.
collection.Sort((i1, i2) => i1.ToString().CompareTo(i2.ToString()));
Tym wyrażeniem lambda tworzę metodę anonimową, która spełnia wymogi delegaty Comparsion.
Tym oto wpisem zamykam cykl Delegaty o 5 smakach. Prawie zapomniałem, że prowadzę taki cykl, ale wielu z was domagało się jego zakończenia.
Czy to wszystko, co można powiedzieć o delegatach w C#?
Nie.
Delegaty pełnią też ważną funkcję w programowaniu asynchronicznym, ale o tym kiedy indziej.