С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/400: Рейтинг темы: голосов - 400, средняя оценка - 4.84
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
1

Сортировка List<T> по разным параметрам

04.05.2009, 20:37. Показов 76968. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте у меня такой вопрос я создал класс с тремя полями данных разного типа
C#
1
2
3
4
5
6
7
 class MyClass: IComparable
    {
        private string _name;
        private string _fullname;
        private DateTime _dateCreation;
        private long _size;
  }
далее я создаю список на основе этого класса
C#
1
private List<MyClass> _listFl;
подскажите как реализовать сортировку данного списка по различным
полям данных , _name, _size,_dateCreation.
Заранее благодарю

Добавлено через 3 часа 40 минут 57 секунд
разобрался с данной проблемой слудующим образом.в этом классе создал статичекий метод для сравнения
C#
1
2
3
4
static public int MyClassCompareDate(MyFile mf1, MyFile mf2)
        {
            return mf1.CreationDate.CompareTo(mf2.CreationDate);
        }
далее
C#
1
_listFl.Sort(MyClass.MyClassCompareDate);
Добавлено через 34 секунды
Может у кого еще есть примеры решения данной проблемы милости просим.
2
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2009, 20:37
Ответы с готовыми решениями:

Сортировка по нескольким параметрам в List<T>
Как сортировка по нескольким параметрам в List&lt;T&gt; La.Sort((a, b) =&gt; a.fam.CompareTo(b.fam)); -...

Сортировка ( List<T>.Sort(...) ) сразу по двум параметрам
Как реализовать сортировку по возрастанию сразу по двум параметрам? Points.Sort((one, two) =&gt;...

Запрос с отдельными столбцами по разным параметрам
Добрый день. Просьба подсказать как правильно сделать запрос. исходная таблица устроена примерно...

Сравнить в Excel две таблицы по разным параметрам
Добрый всем день! помогите пожалуйста, есть две таблицы с разным кол-вом столбцов (14 и 8) и...

22
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
04.05.2009, 20:42 2
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

если public свойства, то
C#
1
_listFl.Sort((a, b) => a._dateCreation.CompareTo(b._dateCreation));
5
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
04.05.2009, 22:07  [ТС] 3
Можете прокоментировать, пожалуйста.

Добавлено через 1 минуту 38 секунд
что значит
C#
1
=>
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
04.05.2009, 23:21 4
Sergei,
это лямбда-функция. доступно в c# 3.0
в "старом" стиле этот же код можно переписать так:
C#
1
2
3
4
.Sort(delegate(MyClass a, MyClass b)
        {
            return a._dateCreation.CompareTo(b._dateCreation);
        });
2
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
05.05.2009, 08:18 5
Sergei, как вариант можно создать наследника от IList<T>. И у него реализовать нужные методы для сортировки.
1
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
05.05.2009, 11:12  [ТС] 6
Green то есть вы имеете ввиду перегрузить методы для сортировки или просто свои?
если можно примерчик.
0
Smart is the new Sexy
32 / 32 / 1
Регистрация: 29.12.2008
Сообщений: 109
05.05.2009, 22:47 7
Для того, чтобы сортировать по различным критериям необходимо создать для этого отдельный тип, который будет наследовать интерфейс IComparer. И в нем можно реализовать несколько сортировок.

Читаем msdn: http://msdn.microsoft.com/ru-r... parer.aspx
1
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
06.05.2009, 04:47 8
Цитата Сообщение от Sergei Посмотреть сообщение
Green то есть вы имеете ввиду перегрузить методы для сортировки или просто свои?
если можно примерчик.
Добавить свои. Способ не очень удобен, если у вас один класс. Т.к. необходимо реализовать весь функционал листа, ради трех сортировок. Намного быстрее или использовать делегаты как у вас, или написать компараторы, как предлагает Del_Piero_10.
Еще как вариант, для каждого экземпляра класса завести доп. свойство указывающее на способ его сортировки. Тогда можно обойтись реализацией интерфейса IComparable, в которой бы сравнение проводилось с учетом этого поля.
1
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
06.05.2009, 10:17  [ТС] 9
То есть чтоб это поле указывало по какое полю данных сортировать список?
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
07.05.2009, 05:43 10
Цитата Сообщение от Sergei Посмотреть сообщение
То есть чтоб это поле указывало по какое полю данных сортировать список?
Угу.
0
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
13.07.2009, 19:54 11
Sergei, хоть тема немного уже и старовата, да всавлю свои 5 копеек, тем более, что, ИМХО, мое решение немного необычно .

Не по теме:

Немного о том, как появилась идея.
Я проработал лид Lua-скриптером в игровой индустрии почти 3.5 года. Стоял у истоков создания нашего движка, по сему неплохо представляю, как и что в нем (и вообще в игровых движках) устроено.
Сейчас вот решил немного повысить свою квалификацию и достаточно серьезно занялся изучением C#. Он подкупает хорошим сочетанием строгости синтаксиса и, в тоже время, простотой понимания чужого кода.
Так вот, читая соответствующую литературу, мне нужны были задачи, на которых я мог бы мог закреплять прочитанное. Так как все последнее время я создавал игры (всего закончил 8 проектов, 5 из которых 3D adventure game) у меня и задачи возникали соответствующие - создавал те или иные элементы игрового движка, которые у нас были написанны или мною на Луа, или, что чаще, реализованы в нашем движке на С++.
В таких задачах часто нужно создавать классы контейнеры для произвольного вида информации. Конечно нет ничего проще чем делать простые обертки вокруг какого-нить List<T>, но в играх обращение к данным в контейнерах может идти десятки раз в секунду и чем быстрее будет происходить поиск, тем быстрее будет работать движек.



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

А потом меня осенило, я вспомнил как достигается быстрый поиск в базах данных (до геймдева я 4 года работал с БД ) - за счет индексации таблиц по необходимым полям.
Вот я и решил создать свой класс, который кроме списка с данными будет хранить дополнительные списки отсортированные по нужным полям. Этот класс берет на себя все вопросы по добавлению и удалению данных, добавлению и удалению индексов, атоматической синхронизации списков, а так же, собственно, бинарному поиску по заранее проиндексированному полю в любой момент времени.
День работы - и у меня получилось создать generic класс, который соответствует всем этим требованиям. За счет применения рефлексии индексируемые поля могут быть практически любого типа.
Если кому кроме идеи еще интересна и реализация - могу выложить.
2
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
13.07.2009, 22:10  [ТС] 12
Конечно выложи либо на емайл!
0
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
14.07.2009, 00:50 13
В виду некоторой глобальности задачи может есть смысл выложить класс куда-то как статью?
Я его пока только проверил на работоспособность.
Для того, что бы это было более-менее законченное решение, нужно код задокументировать, но понять, что к чему можно:

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
  public class ListIndex<T>
  {
    private string id;
    public string ID
    {
      get { return id; }
    }
 
    private int direction;
    public int Direction
    {
      get { return direction; }
    }
 
    private List<T> list;
    public List<T> List
    {
      get { return list; }
    }
 
    public ListIndex(string id):this(id,false)
    {
    }
 
    public ListIndex(string id,bool backDirection)
    {
      this.id=id;
      list=new List<T>();
      this.direction=backDirection?-1:1;
    }
 
    public void Dispose()
    {
      if (list!=null)
      {
        list.Clear();
        list=null;
      }
    }
 
    ~ListIndex()
    {
      Dispose();
    }
  }
 
  public class IndexedList<T> where T:class
  {
    private List<T> list;
    public List<T> List
    {
      get { return list; }
    }
 
    List<ListIndex<T>> indexes;
    BindingFlags bindingAttr=BindingFlags.Public | BindingFlags.Instance;
 
    public IndexedList()
    {
      list=new List<T>();
      indexes=new List<ListIndex<T>>();
    }
 
    private bool TestField(string fieldID)
    {
      Type objType=typeof(T);
      PropertyInfo[] propertyInfo=objType.GetProperties(bindingAttr);
      for (int i=0;i<propertyInfo.Length;i++)
        if (propertyInfo[i].Name==fieldID) return true;
      return false;
    }
 
    public ListIndex<T> GetIndexator(string indexID)
    {
      for (int i=0;i<indexes.Count;i++)
      {
        ListIndex<T> index=indexes[i];
        if (index.ID==indexID)
        {
          return index;
        }
      }
      return null;
    }
 
    public int IndexInIdex(ListIndex<T> index,T obj,bool inserting)
    {
      Type objType=obj.GetType();
      object v=objType.InvokeMember(index.ID,bindingAttr | BindingFlags.GetProperty,null,obj,null);
      return Search4index(index,v,inserting);
    }
 
    public T BinarySearch(string indexID,object v)
    {
      return BinarySearch(GetIndexator(indexID),v);
    }
 
    public T BinarySearch(ListIndex<T> index,object v)
    {
      if (index!=null)
      {
        int pos=Search4index(index,v,false);
        if (pos!=-1) return index.List[pos];
      }
      return null;
    }
    
    public int Search4index(ListIndex<T> index,object v,bool inserting)
    {
      int typeCase=0;
      if (v!=null)
      {
        Type vType=v.GetType();
        if (vType==typeof(int) || vType==typeof(short) || vType==typeof(sbyte) || vType==typeof(long) || vType==typeof(char))
          typeCase=1;
        else if (vType==typeof(uint) || vType==typeof(ushort) || vType==typeof(byte) || vType==typeof(ulong))
          typeCase=2;
        else if (vType==typeof(float) || vType==typeof(double))
          typeCase=3;
        else if (vType==typeof(decimal))
          typeCase=4;
        else if (vType==typeof(string) || vType==typeof(StringBuilder))
          typeCase=5;
        else return -1;
      
        int direction=1;
        int si=0;
        int count=index.List.Count;
        int ei=count-1;
        if (count>0)
        {
          string indexID=index.ID;
          int indexDirection=index.Direction;
          Type objType=typeof(T);
          do
          {
            int i=(si+ei)/2;
 
            object v2=objType.InvokeMember(indexID,bindingAttr | BindingFlags.GetProperty,null,index.List[i],null);
            if (typeCase==0)
              if (v2==null) direction=0;
              else direction=indexDirection;
            else if (typeCase==1)
              direction=(Convert.ToInt64(v)).CompareTo(Convert.ToInt64(v2))*indexDirection;
            else if (typeCase==2)
              direction=(Convert.ToUInt64(v)).CompareTo(Convert.ToUInt64(v2))*indexDirection;
            else if (typeCase==3)
              direction=(Convert.ToDouble(v)).CompareTo(Convert.ToDouble(v2))*indexDirection;
            else if (typeCase==4)
              direction=(Convert.ToDecimal(v)).CompareTo(Convert.ToDecimal(v2))*indexDirection;
            else
              direction=v.ToString().CompareTo(v2.ToString())*indexDirection;
 
            if (direction<0) ei=i-1;
            else if (direction>0) si=i+1;
            else return i;
 
            if (inserting && si>ei)
              if (direction>0) return i+1;
              else return i;
          } while (si<=ei);
        }
        else if (inserting) return 0;
      }
 
      return -1;
    }
 
    public void Add(T obj)
    {
      list.Add(obj);
 
      //now update indexes
      for (int i=0;i<indexes.Count;i++)
      {
        int insPos=IndexInIdex(indexes[i],obj,true);
        indexes[i].List.Insert(insPos,obj);
      }
    }
 
    public void Delete(T obj)
    {
      list.Remove(obj);
      //now update indexes
      for (int i=0;i<indexes.Count;i++)
      {
        int objPos=IndexInIdex(indexes[i],obj,false);
        if (objPos!=-1) indexes[i].List.RemoveAt(objPos);
      }
    }
 
    public bool AddIndex(string id)
    {
      return AddIndex(id,false);
    }
    
    public bool AddIndex(string id,bool backDirection)
    {
      if (TestField(id))
      {
        ListIndex<T> index=new ListIndex<T>(id,backDirection);
        indexes.Add(index);
 
        //fill index list
        for (int i=0;i<list.Count;i++)
        {
          int insPos=IndexInIdex(index,list[i],true);
          index.List.Insert(insPos,list[i]);
        }
        return true;
      }
      return false;
    }
 
    public void DelIndex(string id)
    {
      for (int i=0;i<indexes.Count;i++)
        if (indexes[i].ID==id)
        {
          indexes[i].Dispose();
          indexes.RemoveAt(i);
          return;
        }
    }
 
    public void Dispose()
    {
      for (int i=0;i<indexes.Count;i++)
        indexes[i].Dispose();
      list.Clear();
    }
 
    ~IndexedList()
    {
      Dispose();
    }
  }
Замечания:
В качестве индексируемых полей могут выступать только public properties любого типа-значения
Поддерживается так же обратный порядок сортировки !

Экспериментальный класс

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
  public class myClass
  {
    private static Random rnd=new Random();
    public static Random Rnd
    {
      get { return rnd; }
    }
    
    private int a;
    public int A
    {
      get { return a; }
    }
    private double b;
    public double B
    {
      get { return b; }
    }
    private string s;
    public string S
    {
      get { return s; }
    }
 
    public myClass()
    {
      a=rnd.Next(1,10001);
      b=rnd.NextDouble();
      int ccount=rnd.Next(1,11);
      StringBuilder sb=new StringBuilder(10);
      for (int i=0;i<ccount;i++) sb.Append((char) rnd.Next(65,90));
      s=sb.ToString();
    }
  }
Пример использования
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
      list=new IndexedList<myClass>();
      list.AddIndex("S");
      list.AddIndex("B",true);
      for (int i=0;i<10000;i++)
        list.Add(new myClass());
      list.AddIndex("A");
 
      int count=50;
      myClass[] testArray=new myClass[count];
      for (int i=0;i<count;i++)
      {
        int j=myClass.Rnd.Next(1,10000);
        testArray[i]=list.List[j];
      }
 
      IdleTimerCore<IdleStopwatchTimer,int> timerCore2=new IdleTimerCore<IdleStopwatchTimer,int>();
      timerCore2.Add("speedTimer",10,null);
      Console.WriteLine("serial search int field");
      for (int i=0;i<count;i++)
      {
        for (int j=0;j<list.List.Count;j++)
          if (list.List[j].A==testArray[i].A)
          {
            Console.Write(list.List[j].A+" ");
            break;
          }
      }
      Console.WriteLine("\nserial search double field");
      for (int i=0;i<count;i++)
      {
        for (int j=0;j<list.List.Count;j++)
          if (list.List[j].B==testArray[i].B)
          {
            Console.Write(list.List[j].B+" ");
            break;
          }
      }
      Console.WriteLine("\nserial search string field");
      for (int i=0;i<count;i++)
      {
        for (int j=0;j<list.List.Count;j++)
          if (list.List[j].S==testArray[i].S)
          {
            Console.Write(list.List[j].S+" ");
            break;
          }
      }
      Console.WriteLine("Ellapsed time="+timerCore2.Get("speedTimer").EllapsedTime);
 
      timerCore2.Add("speedTimer",10,null);
 
      ListIndex<myClass> indexatorA=list.GetIndexator("A");
      ListIndex<myClass> indexatorB=list.GetIndexator("B");
      ListIndex<myClass> indexatorS=list.GetIndexator("S");
      Console.WriteLine("\nBinary indexed search int field");
      for (int i=0;i<count;i++)
      {
        Console.Write(list.BinarySearch(indexatorA,testArray[i].A).A+" ");
      }
      Console.WriteLine("\nBinary indexed search double field");
      for (int i=0;i<count;i++)
      {
        Console.Write(list.BinarySearch(indexatorB,testArray[i].B).B+" ");
      }
      Console.WriteLine("\nBinary indexed search string field");
      for (int i=0;i<count;i++)
      {
        Console.Write(list.BinarySearch(indexatorS,testArray[i].S).S+" ");
      }
      Console.WriteLine("\nEllapsed time="+timerCore2.Get("speedTimer").EllapsedTime);
      timerCore2.Delete("speedTimer");
Еще небольшое замечание
IdleTimerCore - это моя обертка вокруг объекта Stopwatch, которая позволяет создавать произвольное к-во таймеров либо для измерения скорости того или иного участка кода (этот пример сравнивает скорость двоичного поиска по индексу против простого поиска перебором с List<T>), или для вызова произвольной функции по истечению заданного отрезка времени.

Нашел в коде маленькую глупость, которая теоретически могла привести к проблемам, заменил
C#
1
Type objType=index.List[0].GetType();
на
C#
1
Type objType=typeof(T);
3
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
15.07.2009, 21:10 14
Sergei, так как, пригодился тебе мой класс ?

Я сегодня над ним еще немного поработал: немного переработал, задокументировал все функции, добавил новую функциональность, а именно:
1) Добавил поле unique для автоматического контроля при добавлении записей с полями имеющие одинаковые значения, (аналог ключевого поля в БД)
2) Переписал методы Add() и AddIndex() которые теперь учитывают значение поля unique.
3) Поправил метод Delete(), который мог удалить нету запись из индексатора в котором находилось несколько записей с тем же значением индексируемого поля
4) Добавил еще два метода для удаления с быстрым поиском наличия по индексируемому полю.
5) Еще некоторые мелкие улучшения

Может кто подскажет, куда это можно выложить в виде статьи с примерами использования?
1
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
16.07.2009, 03:36 15
max_cn, напиши в личку админу. Если одобрит, ссылку в тему.

Добавлено через 27 минут 3 секунды
max_cn, напиши в личку админу. Если одобрит, ссылку в тему.
0
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
17.07.2009, 23:37 16
Я решил выложить класс как статью здесь.
Приношу извинения, что на английском - но там все достаточно простым языком написано, думаю все можно будет понять. Плюс там есть полный проект со всеми файлами.
Рад буду если кому то пригодится.
В дополнения ко всему, что я писал в спецификации ранее, я еще добавил поддержку алиасов для возможности одновременно сортировать по одному полю в прямом и обратном порядке.
1
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
21.07.2009, 13:44 17
В процессе использования своего класса я обнаружил, что ему не достает одного метода - а именно метода, который изменит значение проиндексированного ранее поля с автоматической пересортировкой всех индексов для этого поля.
Что ж, я исправил это упущение, добавил метод :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    /// <summary>
    /// Change value of fieldID property of instance, which can be found
    /// by keyFieldAlias and keyValue, to value
    /// </summary>
    public bool ChangeIndexedFieldValue(string keyFieldAlias,object keyValue,
      string fieldID,object value)
    {
    }
    /// <summary>
    /// Change value of obj.fieldID property to value.
    /// it is safe for all indexer on this property
    /// </summary>
    public bool ChangeIndexedFieldValue(T obj,string fieldID,object value)
    {
    }

Если производится попытка изменить значение у ключевого поля (unique=true) и в списке есть уже запись с полем равным этому значению - мой метод не даст внести такое изменение и вернет false (даже если есть несколько индексаторов по этому полю и некоторые не помечены как уникальные).
Автоматически так же решается проблема, если попробовать изменить значение поля, по которому ранее были удалены все индексы - в таком случае не нужно делать никаких проверок во внешнем коде, класс автоматически изменит значение такого поля безо всяких сортировок.

Этот метод так же вернет false если попытаться изменить значение у поля, у которого нету секции set {}.

Я обновил вложение к той же статье вчера вечером. В самое ближайшее время от туда можно будет скачать как сам класс так и подробный пример, использующий все возможности класса.
0
4 / 4 / 0
Регистрация: 07.08.2015
Сообщений: 40
07.05.2017, 05:11 18
Почему бы Вам не выложить полный код, как выглядит метод
C#
1
CompareTo(...)
раз у вас есть
C#
1
: IComparable
?
А также что за
C#
1
MyFile mf1, MyFile mf2
?
0
Администратор
Эксперт .NET
17709 / 13836 / 5313
Регистрация: 17.03.2014
Сообщений: 28,343
Записей в блоге: 1
07.05.2017, 07:07 19
Цитата Сообщение от protossrethnatr Посмотреть сообщение
Почему бы Вам не выложить полный код
Почему бы вам не обратить внимание что тема была создана в 2009 году?
0
4 / 4 / 0
Регистрация: 07.08.2015
Сообщений: 40
07.05.2017, 07:18 20
В гугле по моему запросу данная тема выпала одной из первых.

Добавлено через 7 минут
Вот моя реализация:
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
    /// <summary>
    /// Класс содержащий 2 поля
    /// </summary>
    public class GROUPS : IComparable<GROUPS>
    {
        /// <summary>
        /// Класс содержащий 2 поля
        /// </summary>
        /// <param name="ID">Id группы VK</param>
        /// <param name="Name">Имя группы</param>
        public GROUPS(uint ID, string Name)
        {
            this.ID = ID; this.Name = Name;
        }
        public uint ID;
        public string Name;
 
        public int CompareTo(object obj)
        {
            return Name.CompareTo(obj);
        }
 
        public int CompareTo(GROUPS other)//сортировка по по полю Name
        {
            if (other == null)
                return 1;
 
            else
                return this.Name.CompareTo(other.Name);
        }
    }
Использование:
C#
1
2
3
4
5
6
7
8
9
List<GROUPS> Collection= new List<GROUPS>();
Collection.Add(new GROUPS(222, "Имя группы 222");
Collection.Add(new GROUPS(111, "Имя группы 111");
Collection.Add(new GROUPS(333, "Имя группы 333");
Collection.Sort();
//Результат сортировки Collection:
//111 Имя группы 111
//222 Имя группы 222
//333 Имя группы 333
0
07.05.2017, 07:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2017, 07:18
Помогаю со студенческими работами здесь

Класс: Задача состоит в том, чтобы уметь сортировать по разным параметрам объекты класса автомобиль.
Сталкнулся с такой наверное обычной задачей. но нформации понятной мне в интеренте не нашел. Имею...

перебрать все элементы List удовлетворяющие параметрам, удаляя взятые
Приветствую! Достаточно нубский вопрос, но никак не решу проблему. if...

Поиск по определенному или двум и более параметрам в List.Find
Есть структура public struct Note { //из списка группы public string...

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


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

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