2010-11-16 9 views
8

Quale sarebbe il modo più veloce per verificare se una stringa contiene corrispondenze in un array di stringhe in C#? Posso farlo usando un ciclo, ma penso che sarebbe troppo lento.C# Controllare se la stringa contiene corrispondenze in un array di stringhe

+3

Perché pensi che sarebbe stato troppo lento? L'hai provato? Qual è la dimensione tipica del tuo set di dati? Indovinare così è una perdita di tempo. –

+0

Potete chiarire gli input e il risultato desiderato? –

+0

Contiene circa 60 articoli, ma nello stesso evento ho più codice. Le prestazioni sono OK, ma mi stavo chiedendo se avrei potuto ottimizzare questo. – david

risposta

4

È possibile combinare le stringhe con espressioni regolari o affermazioni e quindi "eseguirlo in un unico passaggio", ma tecnicamente la regex eseguirà comunque un ciclo internamente. In definitiva, è necessario il ciclo.

+0

OK, l'ho fatto con un ciclo allora. – david

+0

@david, anche le regex devono essere ripetute, penso che nella maggior parte dei casi è ancora più veloce di farlo manualmente. Inoltre, aiuta a un codice più pulito e quindi più facile da mantenere, ad esempio, è necessario modificare i criteri di corrispondenza. – xandy

+4

Alcune persone, quando si trovano di fronte a un problema, pensano: "Lo so, userò le espressioni regolari."Ora hanno due problemi. –

19

utilizzando LINQ:

return array.Any(s => s.Equals(myString)) 

Certo, si potrebbe desiderare di prendere la cultura ed il caso in considerazione, ma questa è l'idea generale. Inoltre, se l'uguaglianza non è ciò che intendevi per "corrispondenze", puoi sempre la funzione che devi usare per "corrispondenza".

+0

Per non parlare del fatto che si sta ancora procedendo in loop, proprio dietro le quinte. – Dinah

1

Se la "matrice" non cambierà mai (o cambierà solo raramente), e avrai molte stringhe di input che stai testando contro di essa, allora potresti costruire un HashSet<string> dalla matrice. HashSet<T>.Contains è un'operazione O (1), anziché un ciclo che è O (N).

Ma ci vorrebbe un po '(piccolo) tempo per costruire l'HashSet. Se la matrice cambia frequentemente, allora un ciclo è l'unico modo realistico per farlo.

7

Io davvero non riuscivo a capire se questo è assolutamente il modo più veloce, ma uno dei modi che ho fatto comunemente questo è:

Questo sarà verificare se la stringa contiene una delle stringhe dell'array:

string[] myStrings = { "a", "b", "c" }; 
string checkThis = "abc"; 

if (myStrings.Any(checkThis.Contains)) 
{ 
    MessageBox.Show("checkThis contains a string from string array myStrings."); 
} 

per verificare se la stringa contiene tutte le stringhe (elementi) della matrice, è sufficiente modificare myStrings.Any nella if per myStrings.All.

Non so che tipo di applicazione questo è, ma ho spesso bisogno di utilizzare:

if (myStrings.Any(checkThis.ToLowerInvariant().Contains)) 

Quindi, se si sta verificando a vedere l'input dell'utente, non importa, se l'utente immette la stringa in lettere MAIUSCOLE, potrebbe essere facilmente invertita utilizzando ToLowerInvariant().

Spero che questo ha aiutato!

+0

È bello, ma se si volesse eseguire il controllo nella direzione opposta ... cioè verificare se la sottostringa esiste negli elementi dell'array –

4

Che funziona bene per me:

string[] characters = new string[] { ".", ",", "'" }; 
bool contains = characters.Any(c => word.Contains(c)); 
+0

Di molte soluzioni, questa è l'unica che ha funzionato all'interno di una dichiarazione 'Where' in ASP.NET Core. – VSG24

Problemi correlati