2009-02-02 15 views
13

Diciamo che ho due stringhe: aeb. Per confrontare se un essere e avere gli stessi valori in cui caso è ignorato, ho sempre usato:Confronto senza problemi di stringhe in C#

// (Assume a and b have been verified not to be null) 

if (a.ToLower() == b.ToLower()) 

Tuttavia, utilizzando Reflector, ho visto un paio di volte in .NET Framework:

// (arg three is ignoreCase) 

if (string.Compare(a, b, true) == 0) 

Ho provato quale è più veloce, e il ToLower() ha battuto ogni volta Compare() con le stringhe che ho usato.

C'è un motivo per cui Compare() anziché ToLower()? Qualcosa di diverso CultureInfo? Mi sto grattando la testa.

risposta

7

La sezione Note dello MSDN article dovrebbe spiegare le cose.Essenzialmente, la ragione è per la compatibilità tra diverse impostazioni di culture.

0

ToLower() non è una funzione di confronto, mette la stringa in lettere minuscole. Quando l'operatore == viene utilizzato su oggetti String in C#, viene ottimizzato dal compilatore. Al centro, entrambi dipendono da System.String.Equals come si vede in Reflector.

+0

Intendeva che l'esempio di ToLower() superava l'esempio (esplicito) Compare(). – strager

+0

@Chris, l'internazionalizzazione può avere un ruolo in questo. – strager

+0

Ok, quindi string.Compare (a.ToLower(), b.ToLower()) sembra essere più veloce di string.Compare (a, b, true) quindi. – core

22

La cosa principale che dovrebbe essere preoccupati, non è la prestazione, è la correttezza, e da questo aspetto il metodo che si probabilmente vogliono essere utilizzare per un confronto case insensitive è uno:

string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0; 

o

a.Equals(b, StringComparison.OrdinalIgnoreCase) 

(il primo è utile se si conoscono le stringhe possono essere null;. il secondo è più semplice da scrivere se si sa già che almeno una stringa non è nullo non ho mai provato le prestazioni, ma Supponiamo che lo farà essere simile.)

Ordinal o OrdinalIgnoreCase sono una scommessa sicura a meno che non si sappia che si desidera utilizzare un altro metodo di confronto; per ottenere le informazioni necessarie per prendere la decisione read this article on MSDN.

+0

+1 qui - le prestazioni non contano. E se si raggiunge un punto in cui l'utilizzo di un metodo di comparazione delle stringhe leggermente inferiore sta causando problemi di prestazioni, è necessario ripensare il proprio approccio. –

+0

Microsoft consiglia di non utilizzare string.Compare() per verificare l'equalizzazione. Esiste una stringa equivalente.Equals() che gestirà i controlli null. Vorrei raccomandare string.Equals (a, b, StringComparison.OrdianlIgnoreCase); – JSwartzen

3

Quando si confrontano stringhe è necessario sempre utilizzare un membro StringComparison esplicito. Le funzioni String sono in qualche modo incoerenti nel modo in cui scelgono di confrontare le stringhe. L'unico modo per garantire il confronto utilizzato è a) memorizzarli tutti (questo include sia te che tutti i membri del tuo team) o b) utilizzare un confronto esplicito per ogni funzione.

È molto meglio essere espliciti e non fare affidamento sulla perfetta conoscenza del gruppo. I tuoi compagni di squadra ti ringrazieranno per questo.

Esempio:

if (StringComparison.OrdinalIgnoreCase.Equals(a,b)) 

Utilizzando ToLower per il confronto ha 2 problemi che posso pensare fuori della parte superiore della mia testa

  1. Si alloca la memoria. Le funzioni di confronto non dovrebbero allocare memoria a meno che non sia assolutamente necessario.
  2. Le stringhe possono essere abbassate in diversi modi. Più notevole, ordinale o culturale Sensibile più basso. In che modo .ToLower() funziona? Personalmente, non lo so. È molto meglio passare una cultura esplicita piuttosto che fare affidamento sull'impostazione predefinita.
+1

Che non viene compilato. volevi dire: 'String.Equals (a, b, StringComparison.OrdinalIgnoreCase.Equals)'? –

0

Potrebbe tuo post il test che mostra chiamando ToLower() è più veloce di un case-insensitive confronto? I miei test mostrano il contrario per essere vero! Indipendentemente da ciò, i punti di altri posters sulla correttezza stanno in piedi.