Estou tentando descobrir qual dessas interfaces preciso implementar. Ambos fazem essencialmente a mesma coisa. Quando eu usaria um em vez do outro?
.net
icomparable
icomparer
Micah
fonte
fonte
Respostas:
Bem, eles não são exatamente a mesma coisa que
IComparer<T>
são implementados em um tipo que é capaz de comparar dois objetos diferentes, enquantoIComparable<T>
são implementados em tipos que são capazes de se comparar com outras instâncias do mesmo tipo.Costumo usar
IComparable<T>
quando preciso saber como outra instância se relaciona com athis
instância.IComparer<T>
é útil para classificar coleçõesIComparer<T>
fora da comparação.fonte
IComparable
como sou comparável . o que significa que posso ser comparado a outra coisa. E lidoIComparer
como um comparador, simplesmente comparo, o que significa que comparo algumas coisas.Use
IComparable<T>
quando a classe tiver uma comparação intrínseca.Use
IComparer<T>
quando quiser um método de comparação diferente da comparação intrínseca da classe, se houver.fonte
Depende da entidade. Por exemplo, seguindo para uma classe como "Aluno", fará sentido ter IComparável com base no Nome.
Mas se um professor 'A' deseja comparar alunos com base no MathScore, e o professor 'B' deseja comparar alunos com base no EnglishScore. Será uma boa ideia implementar IComparer separadamente. (Mais como um padrão de estratégia)
fonte
Tudo depende se o seu tipo é mutável ou não. Você só deve implementar IComparable em tipos não mutáveis. Observe que, se você implementar IComparable, deverá substituir Equals, juntamente com os operadores ==,! =, <E> (consulte o aviso de Análise de Código CA1036).
Citando Dave G nesta postagem do blog :
fonte
Explicação simples por meio de uma história
Basquete colegial. É uma escolha de pátio de escola para as equipes. Eu quero ter o pessoal mais alto / melhor / mais rápido da minha equipe. O que eu faço?
Interface IComparer - compare duas pessoas, diferentes pessoas
Compare(Fred, John)
e expõe quem é melhor.Que tal IComparable? - Compare-se com outra pessoa
Você esteve no FB recentemente? Você vê outras pessoas fazendo coisas legais: viajando pelo mundo, criando invenções, enquanto eu faço algo não tão legal - bem, o que estamos fazendo é usando a interface IComparable.
E a classe comparadora?
A classe Comparer é uma classe base abstrata que implementa a interface IComparer. Você deve derivar desta classe para ter uma implementação concreta. de qualquer forma, a Microsoft recomenda que você USE a classe Comparer em vez de implementar a interface IComparer:
Resumo
Espero que as histórias ajudem você a se lembrar.
fonte
Como outros já disseram, eles não fazem a mesma coisa.
De qualquer forma, hoje em dia não costumo usar o IComparer. Por que eu deveria? Sua responsabilidade (uma entidade externa usada para comparar dois objetos) pode ser tratada de forma muito mais clara com uma expressão lambda, semelhante a como a maioria dos métodos do LINQ funcionam. Escreva um lambda rápido que leva os objetos para comparar como argumentos e retorna um bool. E se o objeto definir sua própria operação de comparação intrínseca, ele pode implementar IComparable.
fonte
IComparable diz que um objeto pode ser comparado a outro. IComparer é um objeto que pode comparar dois itens quaisquer.
fonte
IComparer é uma interface que é usada para ordenar o Array, esta interface forçará a classe a implementar o método Compare (T x, T y), que irá comparar os dois objetos. A instância da classe que implementou esta interface é usada na classificação do Array.
IComparable é uma interface implementada no tipo que precisa comparar os dois objetos do mesmo tipo. Esta interface comparável forçará a classe a implementar o seguinte método CompareTo (T obj)
IEqualityComparer é uma interface que é usada para encontrar o objeto seja igual ou não, agora veremos isso em um exemplo onde temos que encontrar o distinto de um objeto em uma coleção. Esta interface implementará um método Equals (T obj1, T obj2)
Agora vamos dar um exemplo, temos uma classe Employee, com base nesta classe temos que criar uma coleção. Agora temos os seguintes requisitos.
Classifique o Array usando a classe Array 2. Precisa de uma coleção usando o Linq: Remova a duplicata, ordene de cima para baixo, remova um id de funcionário
public class EmployeeIdSorter: IComparer {public int Compare (Employee x, Employee y) {if (x.Id <y.Id) return 1; senão if (x.Id> y.Id) return -1; senão retorne 0; }}
Para mais informações, consulte abaixo http://dotnetvisio.blogspot.in/2015/12/usage-of-icomparer-icomparable-and.html
fonte