Сортировка списка (List) в C#

На днях понадобилось сортировать списки, удивительно, на сколько это оказалось просто.

Допустим, имеем мы класс:
public class User
    {
        public int id;
        public string name;
    }


Создаем список:
List<User> usr = new List<User>();
            //Заполняем список
            User u1 = new User();
            u1.id = 2;
            u1.name = "Ольга";
            usr.Add(u1);
            u1 = new User();
            u1.id = 1;
            u1.name = "Дима";
            usr.Add(u1);
            u1 = new User();
            u1.id = 3;
            u1.name = "Света";
            usr.Add(u1);


Теперь чтобы отсортировать его по полю ID надо сделать всего лишь, вот это:
usr.Sort(delegate(User us1, User us2)
            { return us1.id.CompareTo(us2.id); });


Вот что получается:
Сортируем списки LIST в C#

Далее как видно по картинке, мне стало любопытно, насколько это всё быстро делается?
Результат удивил, я ожидал чего нибудь более скромного.
Заполнял список 100000 записей, в первом поле время ушедшее на заполнение, во втором на сортировку по полю ID.
Сортировка списков List в C#

Исходник примера можно скачать здесь: TestListSort.rar


5 комментариев

avatar
Чётко и в тему!!! Как раз пишу прогу в которой надо сортировать list'ы перед записью в файл!!!

У меня было так:


 GroupConfig temp = new GroupConfig();

            for (int j = 0; j < Grouplist.Count; j++)
            {
                for (int i = 0; i < Grouplist.Count-1; i++)
                {                    
                    string x_str = Grouplist[i].Name;
                    string y_str = Grouplist[i+1].Name; ;
                    x_str = x_str.Substring(1); y_str = y_str.Substring(1); 
                    int x = Convert.ToInt32(x_str); int y = Convert.ToInt32(y_str);

                    if (x>y)
                    {
                        temp = Grouplist[i];
                        Grouplist[i] = Grouplist[i+1];
                        Grouplist[i+1] = temp;
                    }
                }
            }                


Сейчас переделаю под ваш метод и сравню результаты!
avatar
Перепутал, я пузырёк потом поменял на быструю сортировку!
public static void sorting(List<GroupConfig> Grouplist, int first, int last)
          {
              GroupConfig p = Grouplist[(last - first) / 2 + first];
              GroupConfig temp;
              int i = first, j = last;
              while (i <= j)
              {
                  while (Grouplist[i].Name_sub < p.Name_sub && i <= last) ++i;
                  while (Grouplist[j].Name_sub > p.Name_sub && j >= first) --j;
                  if (i <= j)
                  {
                      temp = Grouplist[i];
                      Grouplist[i] = Grouplist[j];
                      Grouplist[j] = temp;
                      ++i; --j;
                  }
              }
              if (j > first) sorting(Grouplist, first, j);
              if (i < last) sorting(Grouplist, i, last);
          }
avatar
увы, ваш метод показал результат в 136,456 мс против 2,9295 мс в моём (быстрая сортировка)



так что ИМХО лучше использовать метод быстрой сортировки
avatar
Чаще всего нет необходимости переписывать заново методы сортировки. В большинстве случаев удобнее использовать стандартные средства, например сортировку из Linq:

list = list.OrderBy(obj => obj.Name_sub).ToList();


Да, иногда это даёт небольшой проигрыш в производительности, но с другой стороны существенно облегчается сопровождение кода и повышается скорость его реализации.

А если всё-таки переписывать сортировку приходится — надо выбирать алгоритм исходя из особенностей конкретной задачи. У каждого есть свои плюсы и минусы.
avatar
Хотел бы предложить так же и свою статью про сортировку списков: C#: Сортировка списка (List), примеры и сравнение производительности
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.