powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Сортировка List<class>
41 сообщений из 41, показаны все 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
Сортировка List<class>
    #38472433
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

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



тут же нет Comparsion. выполняется нативное сравнение, так вот это и нечестно :)
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472435
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и да, тут не делегат, а Expression. вещи совершенно разные.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472483
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУ, тут же нет Comparsion. выполняется нативное сравнение, так вот это и нечестно :)
Не понял тебя. Тут и не должно быть Comparsion, мы же сравниваем Sort(Comparsion) vs OrderBy(). Сравнение честное.

hVosttи да, тут не делегат, а Expression. вещи совершенно разные.
i => i - это сокращенная запись делегата, учите матчасть, товарещ :)
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472488
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
public delegate TResult Func<in T, out TResult>(T arg);



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

нет. не путай лямбда-выражение Expression и делегат Func/Action записанный с использованием лямбда-подставновки аргументов.

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

разницу чувствуешь между

Expression<Func<TSource, TKey>>

и

Func<TSource, TKey>

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

нет. не путай лямбда-выражение Expression и делегат Func/Action записанный с использованием лямбда-подставновки аргументов.

ето ещё кому надо матчасть учить :)

Жжете, батенька :)

Код: c#
1.
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472507
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУ,

разницу чувствуешь между

Expression<Func<TSource, TKey>>

и

Func<TSource, TKey>

?

Чувствую. И?

В обоих случаях используется делегат :)

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

P.S. Всё, кончай балаган. У нас тема другая.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472576
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже википедия знает о делегатах :)

http://ru.wikipedia.org/wiki/Лямбда-выражения Лямбда-выражение (в программировании) — это специальный синтаксис для объявления анонимных делегатов по месту их использования. Используя лямбда-выражения, можно объявлять функции в любом месте кода. Обычно лямбда-выражение допускает замыкание на лексический контекст, в котором это выражение использовано.


То есть лямбда OrderBy(i => i) есть ни что иное, как делегат. Собственно, это вытекает даже из определения

Код: c#
1.
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);



И никакими тут Expression не пахнет даже. Expression<Func> используется в классе Queryable реализациях и никакого отношения к теме не имеет. И тем не менее, даже в этом случае скомпилированное дерево использует указатель на метод (делегат).

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

да погоди ты. много ты знаешь о том, как компилятор работает. LINQ родной для .NET, и делегат он легко переводит в Expression. можешь в рефлекторе глянуть. особенно такие вещи i => i, он сравнивает i, не адресуя вызов анонимному делегату (который вообще не создаётся , ни строчки кода).

и давай по-честному:

Код: 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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
class Program
    {
        class MyClass : IComparable<MyClass>
        {
            private readonly int _field1;
            private readonly string _field2;

            public MyClass(int v)
            {
                _field1 = v;
                _field2 = "par" + v;
            }

            public int CompareTo(MyClass other)
            {
                return _field1.CompareTo(other._field1);
            }
        }


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

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

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

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

            var stopwatch = Stopwatch.StartNew();
            list1.Sort((a, b) => a.CompareTo(b));
            stopwatch.Stop();
            var 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();
            var elapsedOrderBy = stopwatch.Elapsed.TotalMilliseconds;
            if (output)
                Console.WriteLine("List({0}).OrderBy(): {1}ms ({2:.00%})", size, elapsedOrderBy, elapsedOrderBy / elapsedSort);

        }

        static void Main(string[] args)
        {
            // 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>
    #38472606
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЧувствую. И?

В обоих случаях используется делегат :)

нет:

1. a => a.Field

2. a => a.Field1 + a.Field2

во втором случае обычный Func будет делегатом, а в случае Expression Будет 2 узла и 1 операция, никаких делегатов.
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472641
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУ, да погоди ты. много ты знаешь о том, как компилятор работает. LINQ родной для .NET, и делегат он легко переводит в Expression. можешь в рефлекторе глянуть. особенно такие вещи i => i, он сравнивает i, не адресуя вызов анонимному делегату (который вообще не создаётся , ни строчки кода).
Отрой документацию, хватит уже фантазировать Лямбда выражение не обязательно должно строиться с помощью Expression, прекращай писать глупости. Когда лямбда-выражение назначается переменной с типом Expression<TDelegate> , компилятор выдает код для создания дерева выражений, представляющего лямбда-выражение. Компиляция деревьев выражений: тип Expression<TDelegate> предоставляет метод Compile , который компилирует код, представляемый деревом выражений, в исполняемый делегат. Таким образом в конечном итоге у нас будет не Expression, как ты пишешь, а делегат . Заруби это на носу!
...
Рейтинг: 0 / 0
Сортировка List<class>
    #38472644
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУЧувствую. И?

В обоих случаях используется делегат :)

нет:

1. a => a.Field

2. a => a.Field1 + a.Field2

во втором случае обычный Func будет делегатом, а в случае Expression Будет 2 узла и 1 операция, никаких делегатов.

Мля, клоунада продолжается

1. "Обычный" Func не "будет делегатом", это и есть делегат ))
2. Как собирается Expression, я тебе написал выше. Он собирается в конечном итоге тоже в делегат ))

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

ладно, ладно... убедил. чертяка красноречивый.

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

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


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