powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как отсортировать объекты в Collection по условию?
11 сообщений из 11, страница 1 из 1
Как отсортировать объекты в Collection по условию?
    #32535195
ignaci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как отсортировать объекты в Collection по условию?
Следующая проблема:
есть у меня в коллекции набор объектов некоторого пользовательского класса, например

class MyClass {
public int id;
public String Name;
}

мне надо отсортировать эти объекты в порядке возрастания значений ихнего свойства id.
Как справиться с этой проблемой?
...
Рейтинг: 0 / 0
Как отсортировать объекты в Collection по условию?
    #32535235
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
либо написать свой класс MyClassComparer, который имплементирует IComparer, и передать его методу ArrayList.Sort,

либо имплементировать в MyClass IComparable.
...
Рейтинг: 0 / 0
Как отсортировать объекты в Collection по условию?
    #32535872
ignaci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
либо написать свой класс MyClassComparer, который имплементирует IComparer, и передать его методу ArrayList.Sort,

либо имплементировать в MyClass IComparable.

Я не совсем понимаю Это, если вас не затруднит, напишите какой-нибуть небольшой примерчик. Пожалуйста.
...
Рейтинг: 0 / 0
Как отсортировать объекты в Collection по условию?
    #32536002
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[src]class MyClass : IComparer
{
public int id;
public string name;

public int Compare(object x, object y)
{
int idCmp = 0;
int nameCmp = 0;

MyClass a = (MyClass) x;
MyClass b = (MyClass) y;
if (a.id < b.id)
{
idCmp = -1;
}
if (a.id == b.id)
{
idCmp = 0;
}
if (a.id > b.id)
{
idCmp = 1;
}
if (idCmp != 0)
{
return idCmp;
}
nameCmp = String.Compare(a.name, b.name);
return nameCmp;
}

public MyClass(int id, string name )
{
this.id = id;
this.name = name;
}

public MyClass()
{
}
}
/[src]
Пример вашего класса с возможностью сортировки только не только по одному id но и по name - если id совпадает.
...
Рейтинг: 0 / 0
Как отсортировать объекты в Collection по условию?
    #32536011
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
class MyClass : IComparer
{
public int id;
public string name;

public int Compare(object x, object y)
{
int idCmp =  0 ;
int nameCmp =  0 ;

MyClass a = (MyClass) x;
MyClass b = (MyClass) y;
if (a.id < b.id) 
{
idCmp = - 1 ;
}
if (a.id == b.id)
{
idCmp =  0 ;
}
if (a.id > b.id)
{
idCmp =  1 ;
}
if (idCmp !=  0 )
{
return idCmp;
}
nameCmp = String.Compare(a.name, b.name);
return nameCmp;
}

public MyClass(int id, string name )
{
this.id = id;
this.name = name;
}

public MyClass()
{
}
}

Ссори.
Да использовать можно через метод sort - myArrayList.Sort(new MyClass());
...
Рейтинг: 0 / 0
Как отсортировать объекты в Collection по условию?
    #32536588
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему проще и естественне было бы имплиментировать

IComparable и вызывать ArrayList.Sort(), а не имплементировать IComparer и из-за этого создавать "левый" объект Типа MyClass, только для того чтобы скормить его ArrayList.Sort(IComparer)

Имплементация IComparer оправдана тогда, когда, для одного типа необходимо параметризировать сортировку.

Например.

Код: plaintext
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.
using System;
using System.Collections;

namespace Comparator {
	/// <summary>
	/// Summary description for MyClass.
	/// </summary>
	public class MyClass : IComparable {
		public string mId;
		public string mName;
	
		/// <summary>
		/// Implements default compare by Name, by Id
		/// </summary>
		/// <param name="pObj"></param>
		/// <returns></returns>
		public int CompareTo(object pObj) {
			MyClass lMyClass;
			int lResult;

			lMyClass = (MyClass)pObj;
			lResult = this.mName.CompareTo(lMyClass.mName);
			if (lResult ==  0 ) {
				return this.mId.CompareTo(lMyClass.mId);
			}
			return lResult;
		}
	}

	public enum eMyClassOrder {
		ByNameById,
		ByIdByName
	}

	/// <summary>
	/// Custom comparer for MyClass
	/// </summary>
	public class MyClassComparator : IComparer {
		eMyClassOrder mOrder;
 
		public MyClassComparator(eMyClassOrder pOrder) {
			mOrder = pOrder;
		}

		public int Compare(object x, object y) {
			MyClass lMyClassX;
			MyClass lMyClassY;
			int lResult;

			lMyClassX = (MyClass)x;
			lMyClassY = (MyClass)y;

			if (mOrder == eMyClassOrder.ByIdByName) {
				lResult = lMyClassX.mName.CompareTo(lMyClassY.mName);
				if (lResult ==  0 ) {
					return lMyClassX.mId.CompareTo(lMyClassY.mId);
				}
			}
			else if (mOrder == eMyClassOrder.ByNameById) {
				lResult = lMyClassX.mId.CompareTo(lMyClassY.mId);
				if (lResult ==  0 ) {
					return lMyClassX.mName.CompareTo(lMyClassY.mName);
				}
			}
			else {
				return lMyClassX.CompareTo(lMyClassY);
			}
		}
	}

	public class Test {
		public static void TestMyClass() {
			ArrayList lList = new ArrayList();

			// Fill Array List.
			// ....

			// DefaultSort
			lList.Sort();

			// CustoimSort
			lList.Sort(new MyClassComparator(eMyClassOrder.ByIdByName));
			lList.Sort(new MyClassComparator(eMyClassOrder.ByNameById));
		}
	}
}
...
Рейтинг: 0 / 0
Как отсортировать объекты в Collection по условию?
    #32536595
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коррекция

Код: plaintext
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.
using System;
using System.Collections;

namespace Comparator {
	/// <summary>
	/// Summary description for MyClass.
	/// </summary>
	public class MyClass : IComparable {
		public string mId;
		public string mName;
	
		/// <summary>
		/// Implements default compare by Name, by Id
		/// </summary>
		/// <param name="pObj"></param>
		/// <returns></returns>
		public int CompareTo(object pObj) {
			MyClass lMyClass;
			int lResult;

			lMyClass = (MyClass)pObj;
			lResult = this.mName.CompareTo(lMyClass.mName);
			if (lResult ==  0 ) {
				lResult = this.mId.CompareTo(lMyClass.mId);
			}
			return lResult;
		}
	}

	public enum eMyClassOrder {
		ByNameById,
		ByIdByName
	}

	/// <summary>
	/// Custom comparer for MyClass
	/// </summary>
	public class MyClassComparator : IComparer {
		eMyClassOrder mOrder;
 
		public MyClassComparator(eMyClassOrder pOrder) {
			mOrder = pOrder;
		}

		public int Compare(object x, object y) {
			MyClass lMyClassX;
			MyClass lMyClassY;
			int lResult;

			lMyClassX = (MyClass)x;
			lMyClassY = (MyClass)y;

			if (mOrder == eMyClassOrder.ByIdByName) {
				lResult = lMyClassX.mName.CompareTo(lMyClassY.mName);
				if (lResult ==  0 ) {
					lResult = lMyClassX.mId.CompareTo(lMyClassY.mId);
				}
			}
			else if (mOrder == eMyClassOrder.ByNameById) {
				lResult = lMyClassX.mId.CompareTo(lMyClassY.mId);
				if (lResult ==  0 ) {
					lResult = lMyClassX.mName.CompareTo(lMyClassY.mName);
				}
			}
			else {
				lResult = lMyClassX.CompareTo(lMyClassY);
			}
			return lResult;
		}
	}

	public class Test {
		public static void TestMyClass() {
			ArrayList lList = new ArrayList();

			// Fill Array List.
			// ....

			// DefaultSort
			lList.Sort();

			// CustoimSort
			lList.Sort(new MyClassComparator(eMyClassOrder.ByIdByName));
			lList.Sort(new MyClassComparator(eMyClassOrder.ByNameById));
		}
	}
}
...
Рейтинг: 0 / 0
Как отсортировать объекты в Collection по условию?
    #32537992
ignaci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо! Терперь все понятно.
Не примите за наглость, но хотелось бы еще знать - как НАЙТИ елемент в коллекции по определенному условию?
Ну например содержится в коллекции куча объктов моего класса, и мне нужно найти тот из них у которого например id = 5. Как делается такой поиск?
...
Рейтинг: 0 / 0
Как отсортировать объекты в Collection по условию?
    #32538246
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ignaci

Не примите за наглость.

Cкладывайте ваши объекты в DataTable а потом сортируйте и выбирайте с помощью DataView как душе угодно.

Хотя, если потренироваться охота, то можете сами свое написать... a la multy Index SortedList.
...
Рейтинг: 0 / 0
Как отсортировать объекты в Collection по условию?
    #32538417
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>хотелось бы еще знать - как НАЙТИ елемент в коллекции по определенному условию?
Ну например содержится в коллекции куча объктов моего класса, и мне нужно найти тот из них у которого например id = 5. Как делается такой поиск?

Просто "пробежаться" по всем объектам Collection и найти необходимый.
Может быть не так быстро (хотя достаточно быстро для обычного применения), зато работает железно при любых условиях поиска, особенно тогда когда например Collection объектов не отсортирован (если не изменяет склероз то это единственный способ поиска если коллекция не отсортирована)
...
Рейтинг: 0 / 0
Как отсортировать объекты в Collection по условию?
    #32538670
Фотография nex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно примерно вот так:
Код: plaintext
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.
public class MyCollection : CollectionBase
{
   public MyClass this[string name] 
   {
      get  {
         // Search for an object that matches the Name property
         foreach(MyClass c in base.List)
         if (c.Name == name)
            return c;

         return null;
      }
   }

   public MyClass this[int id] 
   {
      get  {
         // Search for an object that matches the id property
         foreach(MyClass c in base.List)
         if (c.id == id)
            return c;

         return null;
      }
   }

		
   public bool Contains(string name)
   {
      foreach(MyClassin base.List)
         if (c.Name == name)
            return true;
   
         return false;
   }
}

Код: plaintext
1.
2.
3.
4.
5.
MyClass cls1 = mycollection["objectname"];
MyClass cls2 = mycollection[ 1 ];

if(mycollection.Contains("objectname"))
   ...

и т.д :)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как отсортировать объекты в Collection по условию?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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