Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка List, по содержимому. Сортировка экземпляров класса в List 
V
    Опции темы
CasperSC
Дата 20.7.2010, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Привет всем! Подскажите кто нибудь как отсортировать экземпляр класса Garage, по маркам машин и по номерам. Сижу ломаю голову, вообще не понимаю, как это сделать.

Код

    public partial class Form1 : Form
    {
        Garage[] garage = new Garage[5];
        String[] cars = { "Mitsubishi", "Opel", "Ford", "Mersedes", "Toyota" };
        Int32[] number = { 1, 2, 3, 4, 5 };
        List<Garage> list = new List<Garage>(5);

        String nachalo;
        String konec;

        public Form1()
        {
            InitializeComponent();
            InitializeGarages();
        }

        public void InitializeGarages()
        {
            for (int i = 0; i < garage.Length; i++)
            {
                garage[i].car = cars[i];
                garage[i].number = number[i];
                list.Add(garage[i]);
            }

            for (int z = 0; z < garage.Length; z++)
            {
                nachalo = nachalo + garage[z].number + " " + garage[z].car + "\n";
            }
            SortGarage();
        }

        public void SortGarage()
        {
            list.Sort();
            MessageBox.Show(nachalo + "\n\n" + konec);
        }
    }

    public struct Garage
    {
       public String car;
       public Int32 number;
    }

PM MAIL   Вверх
CasperSC
Дата 20.7.2010, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Всё сам разобрался.

Код

    public partial class Form1 : Form
    {
        Garage[] garage = new Garage[5];
        String[] cars = { "Mitsubishi", "Opel", "Ford", "Mersedes", "Toyota" };
        Int32[] number = { 1, 2, 3, 4, 5 };
        List<Garage> list = new List<Garage>(5);

        String nachalo;
        String konec;

        public Form1()
        {
            InitializeComponent();
            InitializeGarages();
        }

        public void InitializeGarages()
        {
            for (int f = 0; f < garage.Length; f++)
            {
                garage[f] = new Garage();
            }

            for (int i = 0; i < garage.Length; i++)
            {
                garage[i].car = cars[i];
                garage[i].number = number[i];
                list.Add(garage[i]);
            }

            for (int z = 0; z < garage.Length; z++)
            {
                nachalo = nachalo + garage[z].number + " " + garage[z].car + "\n";
            }
            SortGarage();
        }

        /// <summary>
        /// Отсортировать гаражи
        /// </summary>
        public void SortGarage()
        {
            Array.Sort(garage,
                delegate(Garage garage1, Garage garage2)
            { 
                return garage1.car.CompareTo(garage2.car); 
            });


            for (int z = 0; z < garage.Length; z++)
            {
                konec = konec + garage[z].number + " " + garage[z].car + "\n";
            }
            MessageBox.Show(nachalo + "\n\n" + konec);
        }
    }

    public class Garage : IComparable
    {
       public String car;
       public Int32 number;

       public int CompareTo(object obj)
       {
           if (obj is Garage)
           {
               return this.car.CompareTo((obj as Garage).car); 
           }
           throw new ArgumentException("Объект не Garage");
       }
    }


Это сообщение отредактировал(а) CasperSC - 20.7.2010, 23:47
PM MAIL   Вверх
KelTron
Дата 21.7.2010, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Так будет кошерней:
Код

public enum GarageComparisonType { Car, Number }

public class GarageComparer : IComparer<Garage> 
{
    private GarageComparisonType type;

    public GarageComparer(GarageComparisonType type)
    {
        this.type = type;
    }

    public int Compare(Garage g1, Garage g2)
    {
        switch (this.type)
        {
            case GarageComparisonType.Car:
                return g1.car.CompareTo(g2.car);
            case GarageComparisonType.Number:
                return g1.number.CompareTo(g2.number);
            default:
                throw new Exception("Неизвестный тип сортировки");
        }
    }
}

Используем:
Код

list.Sort(new GarageComparer(GarageComparisonType.Car));//отсортировали по названию
list.Sort(new GarageComparer(GarageComparisonType.Number));//отсортировали по номеру


При добавлении полей в класс Garage можно легко расширить сортировку на много полей.


Это сообщение отредактировал(а) KelTron - 21.7.2010, 09:36


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
N1ko
Дата 23.7.2010, 13:30 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



Думаю проще всего применить Linq. Одна строка и ваша проблема решена.
PM MAIL ICQ   Вверх
Mephisto
Дата 26.7.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



N1ko, дык то при каждом выборе сортировать нужно будет.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.