Domanda

Ho una domanda se questo sia o meno uno standard per l'utilizzo di ICOMPARER in C #.Diciamo che ho una situazione in cui ci sono tre oggetti personali: P1, P2 e P3.Diciamo che chiamo il metodo di confronto che passa in P1 e P2 e il risultato è 0. Questo significa essenzialmente le due persone dovrebbero essere classificate come uguali.Ora dici di chiamare il metodo di confronto che passa in P2 e P3 e il risultato per quello è 0 è 0.Ancora una volta, questo significa che le due persone sono uguali.Parlando logicamente, si può assumere P1 e P3 sono uguali pure;Tuttavia, il metodo Confronto potrebbe essere implementato, tuttavia qualcuno decide di implementarlo.Quindi è uno standard per implementarlo in modo tale che P1 e P3 ritornino anche 0 in questo caso?

Ecco il codice di quello che sto chiedendo:

// Assume these are initialized properly
Person p1 = null, p2 = null, p3 = null;
IComparer<Person> comparer = null;

// Compare person 1 to person 2 and result is 0
Debug.Assert(comparer.Compare(p1, p2) == 0);

// Compare person 2 to person 3 and result is 0
Debug.Assert(comparer.Compare(p2, p3) == 0);

// Would this be a fair assumption that person 1 and person 3 would also be 0?
Debug.Assert(comparer.Compare(p1, p3) == 0);
.

È stato utile?

Soluzione

Sì, sarebbe lo standard.È esplicitamente dichiarato per iCompareble:

.

Se a.compareto (B) restituisce zero e B.compareto (c) restituisce zero, quindi A.compareto (c) è richiesto per tornare zero.

Non riesco a trovare nulla nella documentazione ufficiale che viene fuori e afferma la stessa cosa per ICOMPARE, ma penso che sia sicura di assumere lo stesso vale.

Altri suggerimenti

Non ha nulla a che fare con C #, è una semplice regola matematica: Transività: http://en.wikipedia.org/wiki/Transitive_relation

Allora, sì in breve.

--- Informazioni aggiunte a causa del commento ---

Se vai e leggi la documentazione su ICOMPARER: http://msdn.microsoft.com/en- US / Library / System.Collections.icomparer.compare.aspx

Vedrai che:

Compares two objects and returns a value indicating whether one is less than, 
equal to, or greater than the other.
.

In altre parole, ciò significa che quando si confronta l'oggetto "A" e "B", è necessario ottenere sempre lo stesso risultato quando si chiama più tempo il metodo confrontare. Se non è il caso, significa che otterrai un comportamento indefinito e sarà impossibile fare affidamento su tale funzione per fare qualsiasi ordinamento o confronto.

Quindi, quando si applica correttamente questo metodo, si applicano la regola di transibilità e si può dire senza alcun dubbio che a== c.

Spero che chiarishi la tua domanda sul problema dell'implementazione.

Fa parte del contratto di interfaccia che se a == b e b == c che a == c (proprietà transitiva dell'uguaglianza).Questo non è applicato da nessuna parte del codice, ma è necessario per farlo funzionare correttamente.

L'uguaglianza è transitiva, quindi sì, dovresti supporre e sviluppare il tuo ICOMPARER con quello in mente.

TRANSITIVITÀ

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