Параметры типа интерфейса в методах
От: Аноним  
Дата: 04.03.07 19:38
Оценка:
Возник такой вопрос. Написал я так:
class MyClass : IComparer
{
    int n;

    public MyClass(int _n) { n = _n; }
    
    public int Compare(object x, object y)
    {
        if (((MyClass)x).n < ((MyClass)y).n) return 1;
        if (((MyClass)x).n > ((MyClass)y).n) return -1;
        return 0;
    }

    public override string ToString()
    {
        return String.Empty + n;
    }
}

class Test
{
    public static void Main()
    {
        MyClass A = new MyClass(1);
        MyClass B = new MyClass(2);
        MyClass C = new MyClass(3);
        MyClass D = new MyClass(4);
        MyClass E = new MyClass(5);

        //IComparer
        //Вариант 1: экземпляры класса используются в качетсве ключей...
        SortedList SL = new SortedList(A);             //...скажите это запись вам очень понятна(приятна)?

        //Вариант 2: экземпляры класса НЕ используются в качестве ключей, т.е класс был написан только для того что-бы определить "сравниватель"...
//      SortedList SL = new SortedList(new MyClass()); //...а эта?

        SL.Add(A, 1);
        SL.Add(C, 3);
        SL.Add(B, 2);
        SL.Add(D, 4);
        SL.Add(E, 5);

        IDictionaryEnumerator IDE = SL1.GetEnumerator();
        Console.WriteLine("\n Содержимое списка: ");

        while (IDE.MoveNext())
        {
            Console.WriteLine(" {0}[{1}] = {2}", IDE.Key, SL1.IndexOfKey(IDE.Key), IDE.Value);
        }
    }
}

Может как-то еще можно передать конструктору "сравниватель"? Ну например так:
   ...
   SortedList SL = new SortedList(MyClass); //...означает что SortedList используется Compare класса MyClass
   ...
Re: Параметры типа интерфейса в методах
От: FDSC Россия consp11.github.io блог
Дата: 04.03.07 20:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Возник такой вопрос. Написал я так:

А>
А>class MyClass : IComparer
А>{
А>    int n;

А>    public MyClass(int _n) { n = _n; }
    
А>    public int Compare(object x, object y)
А>    {
А>        if (((MyClass)x).n < ((MyClass)y).n) return 1;
А>        if (((MyClass)x).n > ((MyClass)y).n) return -1;
А>        return 0;
А>    }

А>    public override string ToString()
А>    {
А>        return String.Empty + n;
А>    }
А>}

А>class Test
А>{
А>    public static void Main()
А>    {
А>        MyClass A = new MyClass(1);
А>        MyClass B = new MyClass(2);
А>        MyClass C = new MyClass(3);
А>        MyClass D = new MyClass(4);
А>        MyClass E = new MyClass(5);

А>        //IComparer
А>        //Вариант 1: экземпляры класса используются в качетсве ключей...
А>        SortedList SL = new SortedList(A);             //...скажите это запись вам очень понятна(приятна)?

А>        //Вариант 2: экземпляры класса НЕ используются в качестве ключей, т.е класс был написан только для того что-бы определить "сравниватель"...
А>//      SortedList SL = new SortedList(new MyClass()); //...а эта?

А>        SL.Add(A, 1);
А>        SL.Add(C, 3);
А>        SL.Add(B, 2);
А>        SL.Add(D, 4);
А>        SL.Add(E, 5);

А>        IDictionaryEnumerator IDE = SL1.GetEnumerator();
А>        Console.WriteLine("\n Содержимое списка: ");

А>        while (IDE.MoveNext())
А>        {
А>            Console.WriteLine(" {0}[{1}] = {2}", IDE.Key, SL1.IndexOfKey(IDE.Key), IDE.Value);
А>        }
А>    }
А>}
А>

А> Может как-то еще можно передать конструктору "сравниватель"? Ну например так:
А>
А>   ...
А>   SortedList SL = new SortedList(MyClass); //...означает что SortedList используется Compare класса MyClass
А>   ...
А>



Не понял, нафига это делать???


SortedList ()
Initializes a new instance of the SortedList class that is empty, has the default initial capacity and is sorted according to the IComparable interface implemented by each key added to the SortedList.
Supported by the .NET Compact Framework.


Насколько я понимаю, в твоём варианте как раз можно использовать конструктор без параметров...
Re[2]: Параметры типа интерфейса в методах
От: Alexey Ivanov Россия  
Дата: 04.03.07 20:57
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Насколько я понимаю, в твоём варианте как раз можно использовать конструктор без параметров...


Оверквотить все же не стоит
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[2]: Параметры типа интерфейса в методах
От: Hunta Украина http://dr-leafsey.livejournal.com
Дата: 05.03.07 00:29
Оценка:
А>>
А>>class MyClass : IComparer
А>>


FDS>

FDS>SortedList ()
FDS>Initializes a new instance of the SortedList class that is empty, has the default initial capacity and is sorted according to the IComparable interface implemented by each key added to the SortedList.


FDS>Насколько я понимаю, в твоём варианте как раз можно использовать конструктор без параметров...


Ага, только вместо IComparer реализовать IComparable.
Поступай так, чтобы максима своей воли в любое время могла стать принципом всеобщего законодательства.
Re[2]: Параметры типа интерфейса в методах
От: Аноним  
Дата: 05.03.07 08:32
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Насколько я понимаю, в твоём варианте как раз можно использовать конструктор без параметров...


Можно, если использовать MyClass в качестве ключей, тогда MyClass.Compare будет использоваться для их сравнения "автоматом". А если надо в качестве ключей использовать например целые и сделать так что-бы они сортировались по убыванию, то нужно конструктору SortedList передать "сравниватель" причем выглядеть это будет так:
   SortedList SL = SortedList(new MyClass());  //приходится писать так, причем MyClass может дальше ни где не использоваться

или так:
   MyClass A = new MyClass(A);        //приходится создать обьект со "сравнивателем" до создания списка...
   ...
   SortedList SL = SortedList(A);     //и передать его в качестве параметра

Вот я и спрашиваю как сделать то-же самое посимпатичней
Re[3]: Параметры типа интерфейса в методах
От: Аноним  
Дата: 05.03.07 08:43
Оценка:
Здравствуйте, Hunta, Вы писали:

H>Ага, только вместо IComparer реализовать IComparable.


А смысл какой конструктор SortedList требует IComparer
Re[3]: Параметры типа интерфейса в методах
От: FDSC Россия consp11.github.io блог
Дата: 05.03.07 09:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Вот я и спрашиваю как сделать то-же самое посимпатичней


Это вполне читаемо:
SortedList SL = SortedList(new MyClass());


А никак, насколько я понимаю... Тебе что объект жалко создавать? Если у тебя это только Comparer то таже в .NET это будет очень маленький объект, уж один экземпляр создать на всю программу можно, выглядит это нормально, лично с моей точки зрения.
Re[4]: Параметры типа интерфейса в методах
От: Аноним  
Дата: 05.03.07 09:52
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Это вполне читаемо:

FDS>
FDS>SortedList SL = SortedList(new MyClass());
FDS>


FDS>...выглядит это нормально, лично с моей точки зрения.


Нормально это если, один метод принимает параметр типа интерфейса, а когда их МНОГО чё делать
Re[4]: Параметры типа интерфейса в методах
От: Hunta Украина http://dr-leafsey.livejournal.com
Дата: 05.03.07 14:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Hunta, Вы писали:


H>>Ага, только вместо IComparer реализовать IComparable.


А> А смысл какой конструктор SortedList требует IComparer


Не требует. У него есть конструктор без параметров. В этом случае для сравнения будет использоваться иетод CompareTo интрефейса IComparable, который реализуют обьекты, помещаемые в список.
Поступай так, чтобы максима своей воли в любое время могла стать принципом всеобщего законодательства.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.