Как привести объект к типу класса в методе IComparer.Compare - PullRequest
1 голос
/ 15 октября 2010

Я реализую

int IComparer.Compare(object x, object y);

из интерфейса IComparer.Я знаю, что объекты имеют тип Class1, и я знаю, что один из его членов является class1Instance.myDate, типа DateTime.

Что я хочу сделать, это что-то вроде:

DateTime.Compare( (Class1)x.myDate, (Class1)y.myDate);

Но приведение таким образом не работает.Есть ли альтернатива следующему?

Class1 x2 = x as Class1;

Ответы [ 9 ]

4 голосов
/ 15 октября 2010

Это может быть просто порядок старшинства при вызове приведения к методу. Вы пробовали что-то подобное?

DateTime.Compare( ((Class1)x).myDate, ((Class1)y).myDate);
4 голосов
/ 15 октября 2010

Попробуйте следующее:

DateTime.Compare( ((Class1)x).myDate, ((Class1)y).myDate); 
2 голосов
/ 15 октября 2010

Лучшим решением было бы продлить Comparer<Class1>.

Comparer<T> - это абстрактный класс, который реализует как универсальные, так и неуниверсальные версии IComparer. Преимущество его расширения в том, что вам не нужно реализовывать неуниверсальный метод IComparer.Compare; это уже разумно реализовано базовым классом.

public class Class1Comparer: Comparer<Class1>
{
   public override int Compare(Class1 x, Class1 y)
   {
      //null-checks here          
      return DateTime.Compare(x.myDate, y.myDate);
   }
}
2 голосов
/ 15 октября 2010

Это может быть расщепление волос, но вы можете сделать это:

DateTime.Compare((x as Class1).myDate, (y as Class1).myDate))

1 голос
/ 15 октября 2010

Если по какой-то причине вам не нужно сравнивать разнородные типы, я бы всегда рекомендовал комбинировать общее и более общее (да, хм, «общее» было бы правильным английским словом, глупая терминология .NET)универсальные подходы в одном классе, обращаясь к родовому от non-generic.Большинство родовых сортировок предпочтут универсальный метод, но неуниверсальный будет там для использования с неуниверсальным типом (например, ArrayList), если он когда-либо возникнет.Это также вопрос двух строк, и это логически разумно, поэтому я не буду придерживаться YAGNI в этом случае.,Меня несколько раз поймали на том, что я этого не сделал, и некоторые алгоритмы могли даже вводить их «искусственно».

public class Class1Comparer : IComparer<Class1>, IComparer
{
  public int Compare(Class1 x, Class1 y)
  {
    if(x == null)
      return y == null ? 0 : -1;
    if(y == null)
      return 1;
    return DateTime.Compare(x.myDate, y.myDate);
  }
  public int Compare(object x, object y)
  {
    //This has no type-checking because you said above it isn't needed. I would normally add some just in case.
    return Compare((Class1)x, (Class1)y);
  }
}
1 голос
/ 15 октября 2010

Возможно, вы захотите сделать:

DateTime.Compare( ((Class1)x).myDate, (Class1)y).myDate);

Как у вас есть, он пытается преобразовать поле даты в Class1

1 голос
/ 15 октября 2010

Если вы хотите, чтобы ваш Comparer был набран строго, используйте универсальную версию.

http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx

IComparer

Таким образом, вы реализуете его как:

public class MyComparer : IComparer<Class1>
{
    public int Compare( Class1 x, Class1 y )
    {
        // do comparison stuff here.
    }
}
1 голос
/ 15 октября 2010

Без исключения способ:

Class1 c1 = null;
if (x is Class1) c1 = (Class1)x;
1 голос
/ 15 октября 2010
((Class1)x).myDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...