List sort


Статья об «обратной» сортировке Перемешивание списка

На сегодняшний день существует несколько типов обобщенных коллекций для формирования сортируемых списков данных, ну взять к примеру SortedList.

Однако, иногда бывает необходимо сортировать именно обычный список List<T>

О способе его сортировки старым дедовским методам мы сейчас и поговорим.

Имеем определение класса Teacher:

  public class Teacher  {   public string name;   public string password;   public Guid id;     public Teacher(string name, string password, Guid id)   {   this.name = name;   this.password = password;   this.id = id;   }  }  

Определения свойств опущены для простоты.

Теперь, где-нибудь в коде нам требуется получить всех учителей данной школы.

Допустим, метод GetAllTeachers позволяет получить всех учителей.

  public List<Teacher> GetAllTeachers()  {   List<Teacher> teachers = new List<Teacher>();   teachers.Add(new Teacher("Петя", "2", new Guid()));   teachers.Add(new Teacher("Маша", "5", new Guid()));   teachers.Add(new Teacher("Оля", "3", new Guid()));   teachers.Add(new Teacher("Ваня", "1", new Guid()));     return teachers;  }  


Тогда, следующий код имеет право на существование:

List<Teacher> teachers = GetAllTeachers();

Имея в списке всех учителей мы можем распоряжаться им как хотим, хоть привязать к контролу ListBox.

И все бы хорошо, если метод GetAllTeachers возвращает отсортированную коллекцию. А если нет, нам следует отсортировать её самим.

Не будем пока трогать возможности технологии Linq (до этого мы еще дойдем), а используем анонимные методы, так сказать дедовский метод.

Определимся с условием сортировки. Естественно, логично сортировать в алфавитном порядке, по имени учителя. Поэтому данную процедуру можно выполнить следующим анонимным методом:

  teachers.Sort(delegate(Teacher teacher1, Teacher teacher2)    { return teacher1.Name.CompareTo(teacher2.Name); });  

В итоге, наш список List<Teacher> teachers будет отсортирован по имени по алфавиту.

Статья об «обратной» сортировке Перемешивание списка и статья о сортировке Linq Сортировка List на Linq

skillcoding.com

Создание списка List для сортировки


Допустим нам необходимо хранить данные пользователей: их имя и год рождения. Для этого создадим в языке программирования C# список List, элементами которого, является строковый массив. Имя переменной: people.

Добавим в него четыре элемента с информацией о пользователях:

Соответственно каждый элемент списка List содержит одномерный строковый массив из двух элементов с именем и годом рождения человека.

Вспомогательный метод для вывода списка в консоль

Напишем также метод OutputList, который выводит все элементы коллекции на экран в консоль.

Аргументы метода: list – сам список, который нужно вывести в консоль и label – строка с информацией (она будет выведена перед списком).

Выведем на экран текущее содержимое списка people (запустим программу комбинацией клавиш Ctrl + F5):

Список List до сортировки

Сортировка List в языке C#

Для того, чтобы произвести сортировку списка List, элементами которого являются ссылочные типы данных, сначала необходимо написать метод, описывающий сравнение двух таких “сложных” элементов списка.

Данный метод называется Compare и он должен находиться в отдельно созданном классе, реализующем интерфейс IComparer<>.


Первый пример сортировки списка

Сначала выполним сортировку по такому принципу: отсортируем список people по возрастанию длин имён людей.

Для этого создадим класс с именем NameComparer (имя может быть любым допустимым), который реализует интерфейс IComparer<string[]>. Тип string[] мы указываем, поскольку элемент списка в нашем случаем – это строковый массив.

В классе обязательно должен содержаться метод Compare, в котором описано как сравнивать два объекта (два элемента списка). В нашем случае эти объекты имеют имена o1 и o2.

Сортировка по возрастанию

Если первый объект по нужному признаку больше второго объекта, то следует возвратить единицу. Если меньше, то минус единицу.

Если объекты равны, то возвращаем ноль.

Для сортировки по убыванию поменяйте местами 1 и -1.

В данном примере мы сравниваем длину строк первых (нулевых) элементов двух массивов, поскольку в первом элементе хранится имя пользователя.

Отсортируем список people. Для этого создадим экземпляр класса NameComparer и вызовем у списка метод Sort, передав в него в качестве аргумента экземпляр созданного класса. После выведем список в консоль.


Сортировка списка List на C# по длине имён пользователейВторой пример сортировки списка

Рассмотрим еще один пример сортировки. На этот раз отсортируем список people по году рождения людей (от старших к младшим). Для этого создадим класс YearComparer.

Поскольку у нас год хранится в виде строки, сначала её необходимо конвертировать в число. Делается это с помощью метода Convert.ToInt32() [строки 5 и 6].

Отсортируем List по годам рождения пользователей и выведем его на экран.

Сортировка List в C# по году рождения

Скачать исходник программы из данного урока:

Скачать исходник Репозиторий проекта на GitHub

 

 

Принцип работы метода Sort в списках List

Следует отдельно сказать о том, какие алгоритмы сортировки применяются в методе Sort().

  • Если в списке менее 16 элементов, то сортировка будет производиться методом вставок.
  • Если количество элементов в списке (обозначим буквой N) превышает число 2 * Log(N), то используется алгоритм пирамидальной сортировки.
  • Во всех остальных случаях используется алгоритм быстрой сортировки.

Сложность выполнения метода в среднем равна O(N * Log(N)). В худшем случае сортировка займёт O(N ^ 2) операций.

Также отметим, что метод Sort реализует так называемую нестрогую сортировку, то есть возможны случаи, когда порядок одинаковых элементов будет меняться.

vscode.ru

Please let me complete the answer by @LukeH with some sample code, as I have tested it I believe it may be useful for some:

public class Order {  public string OrderId { get; set; }  public DateTime OrderDate { get; set; }  public int Quantity { get; set; }  public int Total { get; set; }   public Order(string orderId, DateTime orderDate, int quantity, int total)  {  OrderId = orderId;  OrderDate = orderDate;  Quantity = quantity;  Total = total;  } }  public void SampleDataAndTest() {  List<Order> objListOrder = new List<Order>();   objListOrder.Add(new Order("tu me paulo ", Convert.ToDateTime("01/06/2016"), 1, 44));  objListOrder.Add(new Order("ante laudabas", Convert.ToDateTime("02/05/2016"), 2, 55));  objListOrder.Add(new Order("ad ordinem ", Convert.ToDateTime("03/04/2016"), 5, 66));  objListOrder.Add(new Order("collocationem ", Convert.ToDateTime("04/03/2016"), 9, 77));  objListOrder.Add(new Order("que rerum ac ", Convert.ToDateTime("05/02/2016"), 10, 65));  objListOrder.Add(new Order("loco.  

(Order o in objListOrder) Console.WriteLine("OrderId = " + o.OrderId + " OrderDate = " + o.OrderDate.ToString() + " Quantity = " + o.Quantity + " Total = " + o.Total); Console.WriteLine("Sort the list by OrderId ascending:"); objListOrder.Sort((x, y) => x.OrderId.CompareTo(y.OrderId)); foreach (Order o in objListOrder) Console.WriteLine("OrderId = " + o.OrderId + " OrderDate = " + o.OrderDate.ToString() + " Quantity = " + o.Quantity + " Total = " + o.Total); //etc ... }

stackoverflow.com

Поводом опубликовать пост стало то, что при детальном изучении списков (массивов) в Python я не смог найти в сети ни одного простого описания метода сортировки элементов с использованием ключа: list.sort(key=…).

Может быть, конечно, это мне так не повезло и я долго понимаю простые для всех вещи, однако я думаю, что приведенная ниже информация будет весьма полезна таким же начинающим питонистам, как и я сам.

Итак, что мы имеем. Предположим, у нас есть список, который мы бы хотели отсортировать — и состоит он из трех строк разной длины в определенной последовательности:

sortList = ['a', 'сс', 'bbb']


Сортировка элементов массива методом .sort() производится по умолчанию лексикографически — проще говоря, в алфавитном порядке, а также от меньшего значения к большему. Поэтому если мы выполним:

sortList.sort()

то получим на выходе:

>>> ['a', 'bbb', 'cc']

Однако метод .sort() позволяет нам изменять и принцип, и порядок сортировки.

Для изменения принципа сортировки используется ключевое слово key, которое стало доступным начиная с версии Python 2.4.

Предположим, нам хотелось бы отсортировать наш список двумя способами: 1. в алфавитном порядке; 2. по длине строки. Первый способ, впрочем, уже работает как сортировка по умолчанию, однако мы можем добиться таких же результатов и с помощью параметра key:

sortList = ['a', 'cc', 'bbb']

# Создаем "внешнюю" функцию, которая будет сортировать список в алфавитном порядке:
def sortByAlphabet(inputStr):
        return inputStr[0] # Ключом является первый символ в каждой строке, сортируем по нему

# Вторая функция, сортирующая список по длине строки:
def sortByLength(inputStr):
        return len(inputStr) # Ключом является длина каждой строки, сортируем по длине


print u'Исходный список: ', sortList # >>> ['a', 'cc', 'bbb']

sortList.sort(key=sortByAlphabet) # Каждый элемент массива передается в качестве параметра функции
print u'Отсортировано в алфавитном порядке: ', sortList # >>> ['a', 'bbb', 'cc']

sortList.sort(key=sortByLength) # Каждый элемент массива передается в качестве параметра функции
print u'Отсортировано по длине строки: ', sortList # >>> ['a', 'cc', 'bbb']

# Теперь отсортируем по длине строки, но в обратном порядке:
sortList.sort(key=sortByLength, reverse=True) # В обратном порядке
print u'Отсортировано по длине строки, в обратном порядке: ', sortList # >>> ['bbb', 'cc', 'a']

Обратите внимание, что метод .sort() производит действия с исходным списком, переставляя элементы внутри него самого, и НЕ возвращает отсортированную копию исходного списка. Для получения отсортированной копии нужно использовать метод sorted:

newList = sorted(sortList)

— либо такой же вариант, но с параметром key (аналогично описанному выше):

newList = sorted(sortList, key=sortByLength)

У метода .sorted() есть и другие параметры, но мне они показались не настолько запутанными для самостоятельного разбора.

habr.com

 

using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Linq.Expressions; public static class EnumerableHelper { static MethodInfo orderBy = typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public).Where(x => x.Name == "OrderBy" && x.GetParameters().Length == 2).First(); public static IEnumerable<TSource> OrderBy<TSource>(this IEnumerable<TSource> source, string propertyName) { var pi = typeof(TSource).GetProperty(propertyName, BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.Instance); var selectorParam = Expression.Parameter(typeof(TSource), "keySelector"); var sourceParam = Expression.Parameter(typeof(IEnumerable<TSource>), "source"); return Expression.Lambda<Func<IEnumerable<TSource>, IOrderedEnumerable<TSource>>> ( Expression.Call ( orderBy.MakeGenericMethod(typeof(TSource), pi.PropertyType), sourceParam, Expression.Lambda ( typeof(Func<,>).MakeGenericType(typeof(TSource), pi.PropertyType), Expression.Property(selectorParam, pi), selectorParam ) ), sourceParam ) .Compile()(source); } public static IEnumerable<TSource> OrderBy<TSource>(this IEnumerable<TSource> source, string propertyName, bool ascending) { return ascending ? source.OrderBy(propertyName) : source.OrderBy(propertyName).Reverse(); } }

Другой, на этот раз для любого IQueryable:

using System; using System.Linq; using System.Linq.Expressions; using System.Reflection;  public static class IQueryableHelper {   static MethodInfo orderBy = typeof(Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public).Where(x => x.Name == "OrderBy" && x.GetParameters().Length == 2).First();  static MethodInfo orderByDescending = typeof(Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public).Where(x => x.Name == "OrderByDescending" && x.GetParameters().Length == 2).First();   public static IQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source, params string[] sortDescriptors)  {  return sortDescriptors.Length > 0 ? source.OrderBy(sortDescriptors, 0) : source;  }   static IQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source, string[] sortDescriptors, int index)  {  if (index < sortDescriptors.Length - 1) source = source.OrderBy(sortDescriptors, index + 1);  string[] splitted = sortDescriptors[index].Split(' ');  var pi = typeof(TSource).GetProperty(splitted[0], BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.IgnoreCase);  var selectorParam = Expression.Parameter(typeof(TSource), "keySelector");  return source.Provider.CreateQuery<TSource>(Expression.Call((splitted.Length > 1 && string.Compare(splitted[1], "desc", StringComparison.Ordinal) == 0 ? orderByDescending : orderBy).MakeGenericMethod(typeof(TSource), pi.PropertyType), source.Expression, Expression.Lambda(typeof(Func<,>).MakeGenericType(typeof(TSource), pi.PropertyType), Expression.Property(selectorParam, pi), selectorParam)));  }  } 

Вы можете передать несколько критериев сортировки, например:

var q = dc.Felhasznalos.OrderBy(new string[] { "Email", "FelhasznaloID desc" }); 

qaru.site

Options¶

  • Custom — This option lets you sort the list based on an input data attribute. So if the list data type is vectors, you can use the expression e.x which will sort the vectors based on their x component (from the smallest x to the largest x). Another example, if the list data type is stings you can use the expression e[-1] to sort the strings based on their last characters (starting from A to Z). Notice that -1 here is the index of the last character in the string.
  • key List — This option lets you sort list using a reference list. The reference list can be either floats or strings. Suppose I want to sort the list [1,2,3,4] to be [3,1,2,4], the reference list for such ordering would be something like [1,2,0,3] this reference list gets sorted from zero to infinity and the same movement that happened to sort this list will happen to the original list. So for instance, the number 0 in the reference list is the smallest number and thus it should be the first element so we move it from the third location to the first location. That same movement will happen to the original list, the element at the third location(which is 3) will move to the first location (Notice that this is what happened to get [1,2,3,4] to be [3,1,2,4]). The string reference list is exactly the same but it is sorted from A to Z and an alternative reference list in strings for [1,2,0,3] is [b,c,a,d].

animation-nodes-manual.readthedocs.io


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.