Как отсортировать односвязный список сформированный на базе структуры с 4 полями?
Подскажите какой самый эффективный способ сортировки списка структур? Можете ли вы объясниться как правильно описать функцию сортировки через IComparable? И как он работает "внутри"?
Мы имеем:
структуру с поля: Index, Date, Time, Title.
на основе этой структуры создан односвязный список: List<Struct> newList = new List<Struct>(3)
Нужна возможность сортировки по всем 4 полям. Предположим что мы сортируем по Date->Time->Title.Length->Index.
Ответы (1 шт):
Автор решения: kva52
→ Ссылка
правильно описать функцию сортировки через IComparable?
public static class Program
{
public struct Struct
{
public DateTime Date { get; }
public TimeSpan Time { get; }
public string Title { get; }
public int Index { get; }
public Struct(int id, string title, int year, int month, int day, int hour, int
minute, int second)
{
Index = id;
Title = title;
Date = new DateTime(year, month, day);
Time = new TimeSpan(hour, minute, second);
}
}
private static void Main()
{
List<Struct> newList = new List<Struct>
{
new Struct(3, "Заголовок", 2021, 1, 1, 0, 0, 0),
new Struct(2, "Заголовок", 2020, 1, 1, 1, 0, 0),
new Struct(1, "Заголовок", 2020, 1, 1, 1, 5, 0),
};
WriteList("До сортировки:", newList);
newList.Sort(new Comparer());
WriteList("После сортировки:", newList);
}
private static void WriteList(string s, List<Struct> list)
{
Console.WriteLine(s);
foreach (var item in list)
Console.WriteLine(
$"Date={item.Date} time={item.Time} title='{item.Title}'
index={item.Index}");
Console.WriteLine();
}
}
public class Comparer : IComparer<Program.Struct>
{
public int Compare(Program.Struct x, Program.Struct y)
{
int dateComparison = x.Date.CompareTo(y.Date);
if (dateComparison != 0)
return dateComparison;
int timeComparison = x.Time.CompareTo(y.Time);
if (timeComparison != 0)
return timeComparison;
int titleComparison = string.Compare(x.Title, y.Title, StringComparison.Ordinal);
if (titleComparison != 0)
return titleComparison;
return x.Index.CompareTo(y.Index);
}
}
Как-то так.