2012-01-18 12 views
21

Qual è la differenza tra queste due classi?Differenza tra le classi System.StringComparer e System.StringComparison?

Ho utilizzato System.StringComparer.OrdinalIgnoreCase() e System.StringComparison.OrdinalIgnoreCase() ed entrambi producono gli stessi risultati. Hanno qualche differenza o sono entrambi uguali?

+1

potresti pubblicare il tuo caso ed i risultati previsti per ciascuno. Mi chiedo se stai confrontando == vs Equals in termini di riferimenti vs valori – MethodMan

+0

'System.StringComparison.OrdinalIgnoreCase' è un valore enum, non un metodo. Quindi 'System.StringComparison.OrdinalIgnoreCase()' non verrebbe compilato. Non sono sicuro di cosa intendi realmente. – AakashM

risposta

14

StringComparer è un Class che implementa le interfacce di confronto come IComparer, IEqualityComparer, IComparer<String>, in modo che possa essere utilizzata per confrontare due stringhe.

StringComparison è semplicemente un Enum che è possibile passare a determinati metodi per indicare quale tipo di confronto si desidera. In tal caso, sospetto che il metodo sottostante utilizzi uno StringComparer per eseguire il confronto effettivo.

Quando usare ogni

String metodi specifici come String.Equals accetta solo un valore StringComparison, ed è quello che si usa in questo caso.

Si utilizza uno StringComparer per i metodi che accettano un confronto come parametro e vengono chiamati in un contesto in cui verranno confrontate le stringhe. Ad esempio, se si ha un List<String>, e voleva Sort che elencano in maniera case-insensitive, si potrebbe fare:

myList.Sort(StringComparer.OrdinalIgnoreCase); 
3

La domanda è: Perché per avere in un quadro ciascuno di essi?

La spiegazione è questa:

  • StringComparison è:

Specifica la cultura, caso, e ordinare le regole per essere utilizzato da alcuni overload del String.Compare e String.Equals methods

  • StringComparer è:

Rappresenta un'operazione di confronto stringa che utilizza caso specifico e regole cultura-based o di confronto ordinale

notato una differenza?

Nel secondo caso, quindi nel caso di StringComparer c'è una nozione di string comparison operation, ma non di tipo string.

In realtà, se si guarda al this leggerete semplicemente:

Alcuni metodi non-stringhe che hanno confronto stringa come operazione centrale utilizza il tipo StringComparer.

Un esempio, dal medesimo link:

Array.BinarySearch(this.storedNames, name, StringComparer.Ordinal) 

uso StringComparer come un confronto "base" tra contenuto del tipo array riferimento.

+0

Il tuo link non è inglese – Mubarek

+0

Link è stato aggiornato – StingyJack

+1

Ottima risposta. Per renderlo ancora più chiaro: non dovresti mai progettare un metodo o una classe in cui prendi StringComparison come input - dovresti invece assumere StringComparer, poiché ciò consentirebbe ai client del tuo codice di passare nel loro comparatore personalizzato, se necessario. Il comparatore è estendibile, mentre il confronto non lo è. –

Problemi correlati