7

Come confrontare le stringhe con case insensitive e l'accento insensibileCome confrontare le stringhe con case insensitive e l'accento insensibile

Bene questo è fatto facilmente sul server di

SQL Tuttavia vorrei fare lo stesso in C#. NET 4.5.1.

Come posso farlo con il modo più corretto?

intendo questi 3 stringhe dovrebbe tornare uguale rispetto

http://www.buroteknik.com/metylan-c387c4b0ft-tarafli-bant-12cm-x25mt_154202.html 
http://www.buroteknik.com/METYLAN-C387C4B0FT-TARAFLI-BANT-12cm-x25mt_154202.html 
http://www.buroteknik.com/METYLAN-C387C4B0FT-TARAFLı-BANT-12cm-x25mt_154202.html 

Ho bisogno di un metodo che dicono questi 2 sono sotto stesso server SQL dice che sono uguali.

tarafli 
TARAFLİ 
+1

Date un'occhiata a questa risposta http://stackoverflow.com/questions/359827/ignoring-accented-letters-in-string-comparison – p1va

risposta

11

Per ignorare entrambi i casi e gli accenti, è possibile utilizzare string.Compare() con entrambe le IgnoreNonSpace E le IgnoreCase opzioni, in questo modo:

string s1 = "http://www.buroteknik.com/metylan-c387c4b0ft-tarafli-bant-12cm-x25mt_154202.html"; 
string s2 = "http://www.buroteknik.com/METYLAN-C387C4B0FT-TARAFLI-BANT-12cm-x25mt_154202.html"; 
string s3 = "http://www.buroteknik.com/METYLAN-C387C4B0FT-TARAFLı-BANT-12cm-x25mt_154202.html"; 

Console.WriteLine(string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)); 
Console.WriteLine(string.Compare(s2, s3, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)); 

In risposta ai vostri commenti qui sotto, questo funziona per tarafli e TARAFLİ troppo .

Il codice seguente stampa 0, il che significa le stringhe sono uguali:

string s1 = "tarafli"; 
string s2 = "TARAFLİ"; 
Console.WriteLine(string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)); 

E qui sta usando la cultura turca (sto cercando di indovinare a quale la cultura è corretta). Questo stampa anche 0:

string s1 = "tarafli"; 
string s2 = "TARAFLİ"; 

var trlocale = CultureInfo.GetCultureInfo("tr-TR"); 
Console.WriteLine(string.Compare(s1, s2, trlocale, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)); 
+0

grazie per risposta perché abbiamo bisogno di currentculture? – MonsterMMORPG

+0

ok questo metodo non è riuscito per queste 2 stringhe: tarafli - TARAFLİ tuttavia SQL server dice uguale come dovrebbe essere – MonsterMMORPG

+0

@MonsterMMORPG Di quali impostazioni sono le stringhe? –

3

È possibile utilizzare string.Compare con il sovraccarico che prende il corretto CultureInfo e CompareOptions:

string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | 
                CompareOptions.IgnoreCase); 

Edit:

Per quanto riguarda la tua domanda su CultureInfo, da MSDN:

Il confronto utilizza il parametro cultura per ottenere informazioni specifiche della cultura , ad esempio le regole di involucro e l'ordine alfabetico dei caratteri individuali . Ad esempio, una particolare cultura potrebbe specificare che alcune combinazioni di caratteri vengano trattate come un singolo carattere , che i caratteri maiuscoli e minuscoli vengano confrontati in un modo specifico o che l'ordinamento di un carattere dipenda dai caratteri che precedono o seguilo.

+0

grazie per la risposta al perché abbiamo bisogno di currentculture? – MonsterMMORPG

+1

Perché vuoi essere compatibile con la cultura che l'utente utilizza sulla sua macchina. Vedi la mia modifica. –

+0

grazie ancora per la risposta possiamo dire che MS SQL Server usa anche queste informazioni quando imposto la cultura invariante e il caso invariante? – MonsterMMORPG