2014-11-19 3 views
0

У меня есть куча карт в списке, и я хочу, чтобы отсортировать их по возрастанию или по убыванию:IComparer классов для пользовательского класса

private List<Card> cards = new List<Card>(); 

по возрастанию/по убыванию означало бы, я бы сравнить значение карт, просто.

Что мне делать? Интерфейс IComparable кажется недостаточным, поскольку он может сортировать только один «по умолчанию» способ. Поэтому я пытаюсь реализовать IComparer, но терпеть неудачу. В этом же файле класса, как карты, я пытаюсь добавить этот класс для сравнения порядке убывания:

public class CardCompDesc : IComparer<Card> { 
    int IComparer.Compare(object a, object b) 
     // return 0, -1, or -1 later 
     return 0 
    { 
} 

Но уже здесь компилятор жалуется, что не может найти IComparer в текущем контексте. Если я удалю <Card> из определения, класс компилируется. Однако, чтобы иметь возможность сортировать карты выше, что-то вроде этого: this.cards.Sort(new CardCompDesc()); похоже, что мне придется использовать IComparer <> над IComparer. Что я делаю не так?

+3

[ 'IComparer <>'] (http://msdn.microsoft.com/ en-us/library/8ehhxeaf (v = vs.110) .aspx) находится в пространстве имен 'System.Collections.Generic'. Вы уверены, что импортировали это? –

+1

Кроме того, подпись метода Compare неверна. Это должно быть «int Compare (Card a, Card b)», а не явная реализация интерфейса. –

+0

Вы также можете использовать метод расширения Linq OrderBy для сортировки списка по возрастанию. Карточки = card.OrderBy (c => c.Name) .ToList(); descendingCards = cards.OrderByDescending (c => c.Name).К списку(); –

ответ

0

Я просто схватил сравнить, что я использую, который работает .. вот суть этого ...

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

namespace MyNameSpace 
{ 
    public class MyComparer: IComparer<int> 
    { 
     public int Compare(int x, int y) 
     { 
      // x is greater move it up 
      if (x > y) 
      { 
       return 1; 
      } 

      // x is smaller move y up 
      if (x < y) 
      { 
       return -1; 
      } 

      // do nothing (equal) 
      return 0; 
     } 
    } 
} 
+0

Это не в тему, но зачем вам сравнивать с int? –

+2

@ PawełReszka У вас нет, но то, что у меня было там, не имело бы смысла в этом контексте. Я мог бы выбрать любой тип для использования, я просто подумал, что «int» - это самый простой способ описать, как он работает. –

+0

Спасибо, я заработал, я использовал неправильное «использование» и ошибся с подписью Compare-метода в соответствии с комментариями выше. Btw System.Linq на самом деле не нужен? – Jonny

0

Вы путаете два различных типа System.Collections.Generic.IComparer<> и System.Collections.IComparer. Обратите внимание, что они находятся в разных пространствах имен, а первый имеет один параметр типа (IComparer`1[T] .NET), а второй - не общий.

Нет необходимости использовать нестандартный тип.

Так что:

public class CardCompDesc : IComparer<Card> { 
    int IComparer<Card>.Compare(Card a, Card b) { 
     // return 0, -1, or -1 later 
     return 0; 
    } 
} 

если вы настаиваете на этом с явной реализации интерфейса. Однако, почему бы не просто осуществить с помощью метода public, как:

public class CardCompDesc : IComparer<Card> { 
    public int Compare(Card a, Card b) { 
     // return 0, -1, or -1 later 
     return 0; 
    } 
} 

На самом деле, это может быть, лучше указать базовый класс Comparer<Card> (не I) вместо:

public class CardCompDesc : Comparer<Card> { 
    public override int Compare(Card a, Card b) { 
     // return 0, -1, or -1 later 
     return 0; 
    } 
} 

Таким образом ваш CardCompDesc instace будет иIComaparer<Card> и (не общий) IComparer, и вам все равно придется писать только один метод в классе.

Наконец, если вы в порядке с написанием своего единственного метода как стрелки =>, вам даже не нужно писать свой собственный класс. Вы можете просто сказать:

this.cards.Sort((a, b) => { 
     // return 0, -1, or -1 later 
     return 0; 
    }); 

Если вы хотите Comparer<> экземпляр, созданный из стрелки, это:

var yourComparer = Comparer<Card>.Create((a, b) => { 
     // return 0, -1, or -1 later 
     return 0; 
    }); 
Смежные вопросы