powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Сортировка List<class>
25 сообщений из 41, страница 1 из 2
Сортировка List<class>
    #38471456
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как сделать сортировку что бы самому передавать параметры для сортировки
например

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class Test : IComparable
{
public int id { get; set; }
public int regnumber { get; set; }
public string date { get; set; }

public int CompareTo(object obj)
        {
            Test a = (Test)obj;
            if (this.regnumber < a.regnumber)
                return -1;
            else if (a.regnumber < this.regnumber)
                return 1;
            else
                return 0;
        }
}



Но как мне самому задавать параметр сортировки, что бы сортировалось не только по regnumber а если нужно то по date и т д?

Должно быть наподобие такого

Код: c#
1.
2.
3.
4.
List<Test> test = new List<Test>();
 test.Sort(id);
 test.Sort(regnumber);
 test.Sort(date);



Спасибо.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38471479
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708, используй Sort принимающий делегат Comparison<T> или IComparer<T>. В первом случае можно так написать:
Код: c#
1.
2.
3.
test.Sort((a,b) => a.id - b.id);
test.Sort((a,b) => a.regnumber - b.regnumber);
test.Sort((a,b) => a.date.CompareTo(b.date) );
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38471498
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38471548
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

спасибо
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38471806
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ Enumerable.OrderBy

родной List.Sort совершенно однозначно быстрее.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472031
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУ Enumerable.OrderBy

родной List.Sort совершенно однозначно быстрее.
На пару процессорных тиков? OrderBy универсальнее, можно в лямбде строить сложные lazy конструкции.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472086
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНа пару процессорных тиков?

тактов. а это окала 30мс. в асинхронных задачах с конскими просадами на переключение контекста это ещё ой как сказывается.

вообще, OrderBy не является сортировкой. это упорядочивание. можно надеяться на то, что трансляция дерева выражений приведёт нас к SQL-ому ORDER BY, или может даже к QSort, но гарантий вообще нет. никаких.

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

и да. конечно же. на маленьких коллекциях тыщей больше, тыщей меньше, особой разницы мы не увидем.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472093
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, ты чего несешь? Причем тут трансляция? Какие гарантии?
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472104
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

погугли слово "сортировка".
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472110
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

For LINQ to Objects, it's a stable quicksort that is used. For any other kind of LINQ, it's left to the underlying implementation.

:)
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472116
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, ты понимаешь, что такое трансляция? :)
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472118
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

бенчмарки

List(10).Sort(): 0,0025ms (100%)
List(10).OrderBy(): 0,0157ms (628,00%)
List(100).Sort(): 0,0068ms (100%)
List(100).OrderBy(): 0,0294ms (432,35%)
List(1000).Sort(): 0,0758ms (100%)
List(1000).OrderBy(): 0,3107ms (409,89%)
List(10000).Sort(): 0,8969ms (100%)
List(10000).OrderBy(): 4,0751ms (454,35%)
List(100000).Sort(): 10,8541ms (100%)
List(100000).OrderBy(): 50,3497ms (463,88%)
List(1000000).Sort(): 124,1001ms (100%)
List(1000000).OrderBy(): 705,0707ms (568,15%)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
internal class Program {

    private static List<int> CreateList(int size) {

        // use the same seed so that every list has the same elements
        Random random = new Random(589134554);

        List<int> list = new List<int>(size);
        for (int i = 0; i < size; ++i)
            list.Add(random.Next());
        return list;
    }

    private static void Benchmark(int size, bool output = true) {
        List<int> list1 = CreateList(size);
        List<int> list2 = CreateList(size);

        Stopwatch stopwatch = Stopwatch.StartNew();
        list1.Sort();
        stopwatch.Stop();
        double elapsedSort = stopwatch.Elapsed.TotalMilliseconds;
        if (output)
            Console.WriteLine("List({0}).Sort(): {1}ms (100%)", size, elapsedSort);

        stopwatch.Restart();
        list2.OrderBy(i => i).ToList();
        stopwatch.Stop();
        double elapsedOrderBy = stopwatch.Elapsed.TotalMilliseconds;
        if (output)
            Console.WriteLine("List({0}).OrderBy(): {1}ms ({2:.00%})", size, elapsedOrderBy, elapsedOrderBy / elapsedSort);

    }

    internal static void Main() {

        // ensure linq library is loaded and initialized
        Benchmark(1000, false);

        Benchmark(10);
        Benchmark(100);
        Benchmark(1000);
        Benchmark(10000);
        Benchmark(100000);
        Benchmark(1000000);

        Console.ReadKey();
    }
}

...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472121
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУhVostt, ты понимаешь, что такое трансляция? :)

не, это я просто так сказал
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472124
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУhVostt, ты понимаешь, что такое трансляция? :)

не, это я просто так сказал

Трансляция в ОРМ, дерево выражений LINQ транслируется в sql конструкции. А по поводу бенча завтра проверю. Нативный сорт быстрее, бесспорно, но вот с порядком вопрос.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472127
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУА по поводу бенча завтра проверю.

сделай 2 теста. на NET 4.0 и 4.5. Отдельно. сильно удивишься ))
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472128
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И кстати, проверь нативный сорт на делегате с Comparison.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472129
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУА по поводу бенча завтра проверю.

сделай 2 теста. на NET 4.0 и 4.5. Отдельно. сильно удивишься ))

Ну говори уже. Я с мобилы :)
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472131
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУТрансляция в ОРМ

ну дык не обязательно. в случае LINQ to objects дерево транслируется непосредственно в исполняемый IL. отсюда существуют прекомпилируемые LINQ выражения, чтобы не разворачивать в рантайме дерево каждый раз. просто в оконцовке там не самая эффективная реализация qsort (при чем стабильная).
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472133
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНу говори уже. Я с мобилы :)

реализация в 4.0 и 4.5 сортировке сильно отличается. в 4.5 существует некое подобие эвристики чтоли. выбирается наиболее удачный метод сортировки по каким-то своим критериям. т.е. там не всегда будет qsort.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472155
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУТрансляция в ОРМ

ну дык не обязательно. в случае LINQ to objects дерево транслируется непосредственно в исполняемый IL. отсюда существуют прекомпилируемые LINQ выражения, чтобы не разворачивать в рантайме дерево каждый раз. просто в оконцовке там не самая эффективная реализация qsort (при чем стабильная).
Ну так можно сказать, что весь дотнет код транслируется в мсил :) Не фантазируй, короче.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472157
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУНу говори уже. Я с мобилы :)

реализация в 4.0 и 4.5 сортировке сильно отличается. в 4.5 существует некое подобие эвристики чтоли. выбирается наиболее удачный метод сортировки по каким-то своим критериям. т.е. там не всегда будет qsort.
Погоняй на сложных сортировках.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472369
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, тестировал на 1 млн элементов:

...
Код: c#
1.
list1.Sort((a, b) => a.CompareTo(b));


Код: c#
1.
list2.OrderBy(i => i).ToList();



FW 4.5List(1000000).Sort(): 281,7841ms (100%)
List(1000000).OrderBy(): 331,0803ms (117,49%)

FW 4.0List(1000000).Sort(): 298,3634ms (100%)
List(1000000).OrderBy(): 328,2193ms (110,01%)

Как видишь вполне себе приемлемые показатели.

А вот если сравнивать без (a, b) => a.CompareTo(b), а с простым методом Sort() без делегата, то Sort() рвёт в пух и прах:

...List(1000000).Sort(): 72,6328ms (100%)
List(1000000).OrderBy(): 338,6388ms (466,23%)

Итого: как я и говорил, разница в "паре процессорных тиках". Для простой сортировки, не требуещей Sort(Comparison<T> comparison), да - прирост производительности в 4 раза.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472375
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

ну так а ты передай в OrderBy делегат Comparsion, а то нечестно так сравнивать :)

нативное сравнение для Int32 явно быстрее делегата, так как компилятор оптимизирует, оперируя с регистрами (без вызова методов, а это явно медленнее, так как делегаты не инлайнятся).
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472389
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУразница в "паре процессорных тиках"

и всё-таки тактов
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472394
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttну так а ты передай в OrderBy делегат Comparsion, а то нечестно так сравнивать :)
Не понял. А я что по-твоему делаю? :) Я ж говорю, с Comparsion практически идентично, без Comparsion Sort рвет в пух и прах. Но по сабжу нужен именно с Comparsion. Следовательно, OrderBy вполне приемлем.

hVosttнативное сравнение для Int32 явно быстрее делегата, так как компилятор оптимизирует, оперируя с регистрами (без вызова методов, а это явно медленнее, так как делегаты не инлайнятся).
О чем и речь. В OrderBy используется по сути тот же анонимный делегат.
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Сортировка List<class>
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]