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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Array.Sort(), использование 2 параметра в Array.Sort 
:(
    Опции темы
Sash_79
Дата 11.11.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



привет! не получается разобраться с Array.Sort(), мне необходимо произвести сортировку по двум показателям,для использования сортировки по второму показателю использую интерфейс IComparer  и вспомогательный класс  SortBy. Так вот компилятор ругается, на 
Array.Sort(mas, new SortBy()); говорит что вместо new SortBy() необходим параметр типа Array.Хотя в книге говориться,что System.Array предусматривает множество вариантов Sort(),и один из них,как раз и должен принимать объект реализующий IComparer
 Что делать?smile
using System;
using System.Collections.Generic;
using System.Text;
//using System.Collections;

namespace glava4_sravnenie
{
    interface IComparer
    {
        int Compare(object m1, object m2);
    }
    public class SortBy : IComparer
    {
        public SortBy() { }
        int IComparer.Compare(object m1, object m2)
        {
            car t1 = (car)m1;
            car t2 = (car)m2;

            return String.Compare(t1.name, t2.name);
        }
    }
    public class car : IComparable
    {
        public int id;
        public string name;

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

        int IComparable.CompareTo(object o)
        {
            car temp = (car)o;
            if (this.id > temp.id)
                return 1;
            if (this.id < temp.id)
                return -1;
            else
                return 0;
        }

    }
    class work
    {
        static void Main(string[] args)
        {
            car[] mas = new car[3];

            mas[0] = new car(79, "Mers");
            mas[1] = new car(25, "ABMW");
            mas[2] = new car(25, "Opel");

            Console.WriteLine("Ne otsortirovannui massive:");
            foreach (car c in mas)
            {
                Console.WriteLine(c.id + " " + c.name);
            }


            Array.Sort(mas, new SortBy());


            Console.WriteLine("A teper otsortirovannui:");
            foreach (car c in mas)
            {
                Console.WriteLine(c.id + " " + c.name);
            }
          
            Console.ReadLine();

        }
    }
}

PM MAIL   Вверх
thomas
Дата 11.11.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

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



Sash_79
Надо сначала создать обьект сравнения, а потом его подставлять в качестве параметра в метод Sort().
Ошибка записи 
Код

Array.Sort(mas, new SortBy());


Надо что то типа
Код

SortBy mySort;
mySort = new SortBy();
Array.Sort(mas, mySort);


Это сообщение отредактировал(а) thomas - 11.11.2007, 17:17


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Sash_79
Дата 11.11.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



thomas, исправил, но компилятор выдает ту же ошибку
PM MAIL   Вверх
Magnetic
Дата 11.11.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Почему закомментировано включение //using System.Collections; ?
Интерфейс IComparer находится в пространстве имен System.Collections, его не нужно объявлять как пользовательский. Думаю, ошибка из-за этого. Попробуйте раскомментировать включение пространства имен и уберите описание интерфейса IComparer. У меня код с такими поправками работает.

Это сообщение отредактировал(а) Magnetic - 11.11.2007, 19:17
--------------------
Dude, where's my car?
PM MAIL   Вверх
1stain
Дата 11.11.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ты ж здесь
Код

 int IComparer.Compare(object m1, object m2)
        {
          ...

осуществляешь только явную (explicit) реализацию интерфейса IComparer, следовательно в методе Sort, тебе тоже надо привести класс SortBy к интерфейсу IComparer
Код

Array.Sort(mas, new SortBy() as IComparer);


з.ы. Извеняюсь, фигню сморозил...

ученье конечно свет, но не стоит привыкать писать свои варианты того, что есть в библиотеке классов. 

Это сообщение отредактировал(а) 1stain - 11.11.2007, 22:00


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Sash_79
Дата 11.11.2007, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



[/B],Magnetic, если я уберу описание интерфейса Comparer, то программа будет сортировать массив только по именам, а по идентификаторам нет

Добавлено через 3 минуты и 19 секунд
1stain, компилятор всё равно требует чтоб второй параметр Array.Sort() был массивом)
PM MAIL   Вверх
1stain
Дата 11.11.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Sash_79, интересно, ты сам дома учишь шарп по троелсену, или еще ходишь куда-то на занятия?
если первое, то внимательнее читай книги и доки. Если второе - то что у тебя там за препод?
интерфейс IComparer уже реализован в пространстве System.Collections. Как раз это тебе пытаецца объяснить 
Magnetic. И реализован намного более опытными людьми. Вот его и юзай.
Кроме того, позволю себе дать пару советов по синтаксису: пространства имен, классы и интерфейсы называй с большой буквы. прменьше используй public поля, а юзай свойства.
я бы сделал примерно так (тут я использую дженерики - если пока не знаешь, что это такое - не страшно)
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
    class ConsoleApplication1
    {
        static void Main(string[] args)
        {
            Car[] cars = new Car[] { new Car(3, "Lada"), new Car(2, "Kamaz"), new Car(1, "AutoZaz") };

            Console.WriteLine("Cars array before custom sorting");
            foreach (Car car in cars)
                Console.WriteLine(car.ToString());

            Array.Sort(cars, Car.ByNameCarComparerClass.Instance);

            Console.WriteLine("Cars array after custom sorting");
            foreach (Car car in cars)
                Console.WriteLine(car.ToString());
        }
    }

    public class Car : IComparable
    {
        #region Fields & Propertyes
        private int _id;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        } 
        #endregion

        #region .Ctors
        public Car()
        {}

        public Car(int id)
            :this(id, String.Empty)
        {}

        public Car(int id, string name)
        {
            this._id = id;
            this._name = name;
        } 
        #endregion

        #region Public Methods
        public override string ToString()
        {
            return String.Format("Car ID={0,-5} Name={1}", this.Id, this.Name);
        } 
        #endregion

        #region IComparable Members
        public int CompareTo(object obj)
        {
            Car _car = obj as Car;
            if (_car == null)
                throw new ArgumentException("Compared object mast be a Car type");
            return this.Id.CompareTo(_car.Id);
        }
        #endregion

        #region Nested Custom Comparer
        public class ByNameCarComparerClass : IComparer<Car>
        {
            private static ByNameCarComparerClass _instance;
            public static ByNameCarComparerClass Instance
            {
                get
                {
                    if (_instance == null)
                        _instance = new ByNameCarComparerClass();
                    return _instance;
                }
            }

            #region IComparer<Car> Members
            public int Compare(Car x, Car y)
            {
                return StringComparer.InvariantCultureIgnoreCase.Compare(x, y);
            }
            #endregion
        }
        #endregion
    }
}



--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Sash_79
Дата 12.11.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1stain, Спасибо за советsmile Учу сам, скоро просто на нем нужно базу будет писать;)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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