Как отсортировать односвязный список сформированный на базе структуры с 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);
  }
}
 

Как-то так.

→ Ссылка