static void Main(string[] args)
{
string[] emails = GetEmails();
// Сортируем массив.
// Используем полный синтаксис для работы с делегатом - new Xyz(Foo)
Array.Sort(emails, new Comparison<string>(SortByDomain));
#region Cокращенный синтаксис
//// Начиная с C# 2.0 можно использовать сокращенный синтаксис
//// Достаточно передать имя функции. Компилятор создаст экземпляр делегата самостоятельно
//Array.Sort(emails, SortByDomain);
#endregion
#region Анонимный делегат
//// Если функция нужна только в одном месте, то использование
//// анонимного делегата может улучшить читабельность кода
//Array.Sort(
// emails,
// delegate(string email1, string email2)
// {
// string domain1 = email1.Substring(email1.IndexOf('@') + 1);
// string domain2 = email2.Substring(email2.IndexOf('@') + 1);
// int result = string.Compare(domain1, domain2, StringComparison.OrdinalIgnoreCase);
// return result == 0 ? string.Compare(email1, email2, StringComparison.OrdinalIgnoreCase) : result;
// }
//);
#endregion
#region λ-выражения (лямбда)
//Array.Sort(
// emails,
// (string email1, string email2)
// => // Это лямбда-оператор. Он отделяет список аргументов функции от её тела
// {
// string domain1 = email1.Substring(email1.IndexOf('@') + 1);
// string domain2 = email2.Substring(email2.IndexOf('@') + 1);
// int result = string.Compare(domain1, domain2, StringComparison.OrdinalIgnoreCase);
// return result == 0 ? string.Compare(email1, email2, StringComparison.OrdinalIgnoreCase) : result;
// }
//);
#region Типы аргументов можно опустить
Array.Sort(
emails,
(email1, email2) // Мы убрали типы а аргументов т.к. компилятор может их "угадать"
=> // Это лямбда-оператор. Он отделяет список аргументов функции от её тела
{
string domain1 = email1.Substring(email1.IndexOf('@') + 1);
string domain2 = email2.Substring(email2.IndexOf('@') + 1);
int result = string.Compare(domain1, domain2, StringComparison.OrdinalIgnoreCase);
return result == 0 ? string.Compare(email1, email2, StringComparison.OrdinalIgnoreCase) : result;
}
);
#endregion
#region λ-выражения для функций с одной return строкой
//Array.Sort(
// emails,
// (email1, email2)
// =>
// {
// return string.Compare(GetDomain(email1), GetDomain(email2), StringComparison.OrdinalIgnoreCase);
// }
//);
//Array.Sort(
// emails,
// (email1, email2) => string.Compare(GetDomain(email1), GetDomain(email2), StringComparison.OrdinalIgnoreCase)
//);
#endregion
#endregion
foreach (string email in emails)
{
Console.WriteLine(email);
}
}