Domanda

Sto cercando di capire quale di queste interfacce ho bisogno di implementare. Entrambi fanno essenzialmente la stessa cosa. Quando si usa uno sopra l'altro?

È stato utile?

Soluzione

Anche loro non sono molto la stessa cosa di IComparer<T> è implementato su un tipo che è in grado di confrontare due oggetti diversi, mentre IComparable<T> è implementata su tipi che sono in grado di confrontarsi con altre istanze della stesso tipo.

Io tendo ad usare IComparable<T> per momenti in cui ho bisogno di sapere come un'altra istanza si riferisce alla this esempio. IComparer<T> è utile per l'ordinamento collezioni come il IComparer<T> sta al di fuori del confronto.

Altri suggerimenti

Usa IComparable<T> quando la classe ha un confronto intrinseca.

Utilizzare IComparer<T> quando si desidera un metodo di confronto diverso da quello della classe confronto intrinseca, se ne ha uno.

Dipende dal soggetto. Ad esempio a seguito di una classe come "Student", renderà senso avere IComparable in base al nome.

class Student : IComparable 
{
    public string Name { get; set; }
    public int MathScore { get; set; }
    public int EnglishScore { get; set; }

    public int TotalScore 
    {
        get
        {
            return this.MathScore + this.EnglishScore; 
        }
    }

    public int CompareTo(object obj)
    {
        return CompareTo(obj as Student);  
    }

    public int CompareTo(Student other)
    {
        if (other == null)
        {
            return 1;
        }
        return this.Name.CompareTo(other.Name);  
    }
}

Ma se un insegnante 'A' vuole mettere a confronto gli studenti sulla base di MathScore, e insegnante 'B' vuole mettere a confronto gli studenti sulla base di EnglishScore. Sarà una buona idea per implementare IComparer separatamente. (Più come un modello di strategia)

class CompareByMathScore : IComparer<Student>
{
    public int Compare(Student x, Student y)
    {
        if (x.MathScore > y.MathScore)
          return 1;
        if (x.MathScore < y.MathScore)
          return -1;
        else
          return 0;
    }
}

Tutto dipende dal fatto che il tipo è mutevole o meno. Si dovrebbe solo implementare IComparable sui tipi non mutabili. Si noti che se si implementa IComparable, è necessario eseguire l'override Equals, insieme con il ==,! =, operatori (vedi analisi del codice di avvertimento CA1036).

Citando Dave G da questo post del blog :

  

Ma la risposta corretta è quello di attuare IComparer invece di IComparable se gli oggetti sono mutabili, e passare un'istanza del IComparer alle funzioni di ordinamento in caso di necessità.

     

Dato che l'IComparer è solo un oggetto usa e getta utilizzato per l'ordinamento in quel punto nel tempo, l'oggetto può avere alcuna semantica mutevoli che desiderate. Inoltre, non richiede o anche suggerire utilizzando Eguali, GetHashCode o == -. Sei libero di definire in alcun modo per favore

     

Infine, è possibile definire IComparer più del tuo tipo per l'ordinamento su diversi campi o con regole diverse. Questo è molto più flessibile di essere bloccato con una definizione.

     

In breve:. Usa IComparable per i tipi di valore e IComparer per i tipi di riferimento

semplice spiegazione tramite una storia

di basket del liceo. Si tratta di un pick cortile della scuola per le squadre. Voglio ottenere le più alte / migliore / più veloci gente nella mia squadra. Cosa devo fare?

IComparer Interfaccia - Confronto due persone distinte persone

  • Questo mi permette di confrontare due ragazzi in fila ......... che è fondamentalmente. Fred vs John .......... io li gettano in una classe concreta che implementa l'interfaccia. Compare(Fred, John) e sputa fuori chi è migliore.

Che dire di IComparable - Confronta te stesso con qualcun altro

Sei stato su FB di recente? Si vede altre persone a fare cose interessanti:. Giro per il mondo, creando invenzioni, mentre io sto facendo qualcosa di non proprio come fresco - e quello che stiamo facendo sta facendo uso dell'interfaccia IComparable

  • stiamo confrontando l'istanza corrente (da soli) con un altro oggetto (qualcun altro), che è dello stesso tipo (persona).

Che dire della Classe Comparer?

La classe Comparer è una classe base astratta che implementa l'interfaccia IComparer. Si dovrebbe derivare da questa classe ad avere una concreta attuazione. In ogni modo, Microsoft consiglia di utilizzare la classe Comparer piuttosto che implementare l'interfaccia IComparer:

  

Si consiglia si deriva dalla classe Comparer invece di implementare l'interfaccia IComparer, perché la classe Comparer fornisce un'implementazione un'interfaccia esplicita del metodo IComparer.Compare e la proprietà di default che ottiene l'operatore di confronto di default per l'oggetto.

Sommario

  • IComparer - line up due cose e confrontare
  • .
  • IComparable - paragoni agli altri su FB
  • .

Spero che le storie aiutano a ricordare.

Come altri hanno detto, non fanno la stessa cosa.

In ogni caso, in questi giorni io non tendono ad usare IComparer. Perché dovrei? La sua responsabilità (un soggetto esterno utilizzato per confrontare due oggetti) può essere gestito molto più pulito con un'espressione lambda, simile a come la maggior parte dei metodi di lavoro di LINQ. Scrivi una rapida lambda che prende gli oggetti da confrontare come argomenti, e restituisce un bool. E se l'oggetto definisce il proprio funzionamento intrinseco confrontare, può implementare invece IComparable.

IComparable dice un oggetto può essere confrontato con un altro. IComparer è un oggetto che può confrontare due oggetti.

IComparer è un'interfaccia che viene utilizzato per ordinare l'array, questa interfaccia costringerà la classe di attuare la Confrontare metodo (T x, y T), che confronta i due oggetti. L'istanza della classe che implementato questa interfaccia è utilizzata nello smistamento della matrice.

IComparable è un'interfaccia viene implementata nel tipo che ha bisogno di confrontare i due oggetti dello stesso tipo, Questa interfaccia paragonabile forzerà la classe di attuare il seguente metodo CompareTo (T obj)

IEqualityComparer è un'interfaccia che viene utilizzato per trovare l'oggetto se è uguale o no, adesso vedremo questo in un campione in cui dobbiamo trovare la distinta di un oggetto in una collezione. Questa interfaccia implementare un metodo Equals (T obj1, obj2 T)

Ora fare un esempio abbiamo una classe Employee, sulla base di questa classe, dobbiamo creare una collezione. Ora abbiamo i seguenti requisiti.

ordinare l'array utilizzando classe Array 2. Hai bisogno di una collezione utilizzando Linq: Rimuovere il duplicato, Ordina per maggiore al minore, rimuovere un impiegato id

abstract public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { set; get; }
}

public enum SortType
{
    ByID,
    BySalary
}

class EmployeeIdSorter pubblica: IComparer         {             public int Compare (Employee x, y Employee)             {                 if (x.Id y.Id)                     ritorno -1;                 altro                     return 0;             }         }

    public class EmployeeSalarySorter : IComparer<Employee>
    {
        public int Compare(Employee x, Employee y)
        {
            if (x.Salary < y.Salary)
                return 1;
            else if (x.Salary > y.Salary)
                return -1;
            else
                return 0;
        }
    }

Per ulteriori informazioni RIFERIME qui sotto http://dotnetvisio.blogspot.in/2015/12 /usage-of-icomparer-icomparable-and.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top