Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
29 / 28 / 18
Регистрация: 06.04.2010
Сообщений: 68
1

Сортировка list

21.03.2011, 10:45. Показов 3634. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно отсортировать список "вручную", допустим методом пузырька...
Вопрос заключается в следующем... Как правильно передать поле по которому нужно отсортировать?
Набросок:
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
class Spis
    {
        public string Name; 
        public double Num; 
        public string VIP;
        public string Statys;
    }
 
...
 
static void SortSpis(List<Spis> BDf, Spis a)
        {
            for(int i=0; i < BDf.Count; i++)
            {
                for(int j = BDf.Count-1; j > i; j--)
                {
                    if (BDf[j - 1].a > BDf[j].a)
                    {
                        Spis x = BDf[j - 1].a;
                        BDf[j - 1].a = BDf[j].a;
                        BDf[j].a = x;
                    }
                }
            }
        }
 
...
 
List<Spis> BD = new List<Spis>();
SortSpis(BD, Name);
...
SortSpis(BD, Num);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2011, 10:45
Ответы с готовыми решениями:

Сортировка двумерного List<List<string>>, по 1-ой строке, чтобы элементы 2-ой строки передвинулись в соответствии с 1-ой
Дан двумерный массив List&lt;List&lt;string&gt;&gt; , состоящий из двух строк, как его отсортировать по первой...

Сортировка ДВУМЕРНОГО List<List<T>>
Добрый день или вечер. В написании одной программулины у меня возникли проблемы с сортировкой...

Сортировка List<List<string>>
Как отсортировать список списков по количеству элементов в элементах :D или в удобоваримом для...

Сортировка List внутри List
Доброго времени суток! Имеется структура вида: public class Node { public string Name {...

9
637 / 498 / 77
Регистрация: 28.07.2010
Сообщений: 895
21.03.2011, 11:54 2
Есть два пути решения проблемы:
1. Рефлексия, но это геморно. В коде делается как-то так:
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
static void SortSpis(List<Spis> BDf, string objName)
{
     for (int i=0; i < BDf.Count; i++)
     {
          for (int j = BDf.Count-1; j > i; j--)
          {
               var st = typeof(Spis);
               FieldInfo objf = st.GetFiled(objName);
               object v1 = objf.GetValue(BDf[j - 1]);
               object v2 = objf.GetValue(BDf[j]);
               if (IsNumeric(v1) & (double)v1 > (double)v2)
               {
                     Spis x = BDf[j - 1].a;
                     BDf[j - 1].a = BDf[j].a;
                     BDf[j].a = x;
                }
            }
      }
}
 
public static bool IsNumeric(object expression)
{
    if (expression == null)
    return false;
 
    double number;
    return Double.TryParse(Convert.ToString(expression, CultureInfo.InvariantCulture),System.Globalization.NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number);
}
2. Делегаты - легко и просто:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void SortSpis(List<Spis> BDf, Func<Spis, Spis, bool> del)
{
     for (int i=0; i < BDf.Count; i++)
     {
          for (int j = BDf.Count-1; j > i; j--)
          {
               if (del(BDf[j - 1], BDf[j]))
               {
                     Spis x = BDf[j - 1].a;
                     BDf[j - 1].a = BDf[j].a;
                     BDf[j].a = x;
                }
            }
      }
}
 
//Using:
SortSpis(BD, (v1, v2) => v1.Num > v2.Num);
1
29 / 28 / 18
Регистрация: 06.04.2010
Сообщений: 68
21.03.2011, 12:22  [ТС] 3
Alex Sabaka, все равно не понял, допустим разберемся на делегатах, как в вашем примере может происходить сортировка, если к примеру "BDf[j].a" неправильная запись, суть какова... передать "а" чтобы по этому столбцу производилась сортировка согласно алгоритму.
0
Шаровик затейник
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
21.03.2011, 12:48 4
как то вы бредово сортируете... if (BDf[j - 1].a > BDf[j].a) откуда в классе Spis есть член который именуется буквой а? Вам нужно сортировать по имени? Пишите так:
C#
1
if (BDf[j - 1].Name[0] > BDf[j].Name[0])
где Name[0] - первая буква

Добавлено через 3 минуты
передать поле по которому можно сортировать к примеру типа int, которое выберет человек, а потом с помощью switch сортировать в зависимости от поля.
0
29 / 28 / 18
Регистрация: 06.04.2010
Сообщений: 68
21.03.2011, 12:51  [ТС] 5
Crudelis, по поводу "Spis a" я для образца написал... а так то ясное дело что просто "BDf[j].Name" можно написать... мне нужно автоматизировать... чтобы я просто в дальнейшем указывал по чему сортируем.
к примеру:
C#
1
2
3
SortSpis(BD, Name);
или
SortSpis(BD, VIP);
пусть даже все поля будут одного типа... вопрос как конкретное поле передать в сортировку.... а через switch к каждому полю писать свою сортировку нерационально
0
637 / 498 / 77
Регистрация: 28.07.2010
Сообщений: 895
21.03.2011, 13:29 6
Если хотите так делать, то вариант с рефлексией то что нужно.
1
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
21.03.2011, 13:30 7
Посмотри тут FAQ для студентов или школьников. Можешь сделать по аналогии.
1
29 / 28 / 18
Регистрация: 06.04.2010
Сообщений: 68
21.03.2011, 13:42  [ТС] 8
Unril, да это понятно что можно отсортировать используя готовый метод Sort... меня же интересует мой метод сортировки и как его можно автоматизировать, а именно как в него передавать данные
0
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
21.03.2011, 14:14 9
Говорю же, по аналогии:
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApplicationTest {
    public static class Program {
        private static void Main() {
            var myClasses = new List<MyClass>();
 
            // Заполним случайными элементами
            AddRandomElements( myClasses );
 
            // Сортировака по именам с использованием делегата
            MySort( myClasses, ( a, b ) => a.Name.CompareTo( b.Name ) );
 
            Print( myClasses );
 
            // Сортировка по номеру с использованием класса компаратора
            MySort( myClasses, new MyNumberComparer() );
 
            Print( myClasses );
 
            Console.ReadKey();
        }
 
        private static void MySort( IList<MyClass> list, Func<MyClass, MyClass, int> comparer ) {
            for ( int i = 0; i < list.Count; i++ ) {
                for ( int j = list.Count - 1; j > i; j-- ) {
                    if ( comparer( list[ j - 1 ], list[ j ] ) == 1 ) {
                        MyClass temp = list[ j - 1 ];
                        list[ j - 1 ] = list[ j ];
                        list[ j ] = temp;
                    }
                }
            }
        }
 
        private static void MySort( IList<MyClass> list, IComparer<MyClass> comparer ) {
            for ( int i = 0; i < list.Count; i++ ) {
                for ( int j = list.Count - 1; j > i; j-- ) {
                    if ( comparer.Compare( list[ j - 1 ], list[ j ] ) == 1 ) {
                        MyClass temp = list[ j - 1 ];
                        list[ j - 1 ] = list[ j ];
                        list[ j ] = temp;
                    }
                }
            }
        }
 
        private static void AddRandomElements( List<MyClass> myClasses ) {
            var r = new Random();
 
            for ( int i = 0; i < 10; i++ ) {
                var randomString = new string( Enumerable.Range( 0, 5 )
                                                   .Select( n => r.Next( 'a', 'z' ) )
                                                   .Select( Convert.ToChar )
                                                   .ToArray() );
                myClasses.Add( new MyClass( r.Next( 3 ), randomString ) );
            }
        }
 
        private static void Print( IEnumerable<MyClass> myClasses ) {
            foreach ( MyClass myClass in myClasses ) {
                Console.WriteLine( myClass );
            }
            Console.WriteLine();
        }
    }
 
    internal class MyNumberComparer : IComparer<MyClass> {
        #region IComparer<MyClass> Members
 
        public int Compare( MyClass x, MyClass y ) {
            return x.Number.CompareTo( y.Number );
        }
 
        #endregion
    }
 
    public class MyClass {
        public MyClass( int number, string name ) {
            Number = number;
            Name = name;
        }
 
        public int Number { get; set; }
        public string Name { get; set; }
 
        public override string ToString() {
            return string.Format( "Number: {0}\tName: {1}", Number, Name );
        }
    }
}
1
29 / 28 / 18
Регистрация: 06.04.2010
Сообщений: 68
21.03.2011, 14:24  [ТС] 10
Всем спасибо!
0
21.03.2011, 14:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2011, 14:24
Помогаю со студенческими работами здесь

Сортировка List<T>
Есть класс Cards. В нём 2 поля: public Values Value; public Suits Suit; это перечисления....

Сортировка List<>
Есть массив каталогов. Я создал List, и добавил его туда. Как мне отсортировать List по свойству...

Сортировка List
Вопрос такой, есть у меня класс class details { private int cout; ...

Сортировка List
Есть необходимость отсортировать List&lt;string&gt; таким образом, что бы в строке отслеживалась...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru