Press "Enter" to skip to content

Tips, Funzioni sulle stringhe

Convertire una collezione di stringhe in un array

Predisponendo una funzione helper per cercare se una stringa è contenuta in una lista di stringhe, ho deciso che le due sorgenti più comuni per la lista potevano essere un array di stringhe oppure una string collection, pertanto, fatta la funzione che verifica l’esistenza di una stringa in un array, per creare l’overload che fa lo stesso in una string collection, il metodo migliore per evitare codice ridondante era chiamare la prima funzione, trasformando la string collection in un array.

Facendo una ricerca con Google, ho trovato questo metodo:

string[] strings = (string[])new ArrayList(pStringColl).ToArray(typeof(string)); 

Però mi sembrava piuttosto becero, perché fare una serie di box, unbox e inoltre scomodare un arraylist, non è molto efficiente. Allora ho chiesto parere a Rudy che giustamente mi ha spedito su MSDN, dove c’era qualcosa di meglio:

string[] strings = new string[pStringColl.Count];
pStringColl.CopyTo( strings,0);

Questa, molto più efficientemente, utilizza il metodo CopyTo della collezione che guardacaso può generare un array.

Verificare se una stringa è contenuta in una lista

Visto che ne ho parlato, vi inserisco questo minuscolo metodo, non è certo il più efficiente, ne il più bello, però il suo lavoro lo fa.

        public static bool IsInList(string pStringValue, bool pExact, string[] pStringList)
        {
            bool retIsInList = false;
            if (pStringList.Length > 0)
            {
                if (pExact)
                {
                    for (int i = 0; i < pStringList.Length; i++)
                    {
                        if (pStringValue == pStringList[i])
                        {
                            retIsInList = true;
                            break;
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < pStringList.Length; i++)
                    {
                        if (pStringList[i].Contains(pStringValue))
                        {
                            retIsInList = true;
                            break;
                        }
                    }
                }
            }
            return (retIsInList);
        }

Lo scopo di questo metodo statico, non è fare ricerche all’interno di database, documenti o altro, è semplicemente quello di evitare questo tipo di controlli:

string name = DammiIlNome();

if( name != "Mario" && name != "Pietro" && name != "Giovanni" )
{
   //fai qualcosa
}
else
{
   //Fai qualcos'altro
}

Succede spesso di fare controlli su una lista di valori, nel mio caso si trattava di verificare i valori di una cella di una datagrid per ciascuna delle sue righe e nel caso questa assumesse alcuni valori specifici, doveva essere predisposto un dato, in caso diverso il dato era calcolato in altro modo. La mia funzione, invece di farmi fare una lista di AND, trasforma il controllo qui sopra in questo modo:

string name = DammiIlNome();

if( !IsInList(name, true, new string[]{ "Mario", "Pietro", "Giovanni"} ) )
{
   //fai qualcosa
}
else
{
   //Fai qualcos'altro
}

Così se domattina dovessi aggiungere alla lista “Rodomonte”, non devo faticare troppo.

Il parametro pExact serve per controllare l’esistenza di una stringa esatta, oppure verificare se la stringa è contenuta in una lista, la versione con pExact = false fa in modo che io possa controllare anche solo una porzione di stringa. Si potrebbe ulteriormente affinare la cosa aggiungendo la possibilità di cercare quando una stringa compare all’inizio, alla fine oppure in una certa posizione di una lista di altre stringhe.

Potrebbe essere interessante, nel caso di stringhe parziali, comporre una sottolista delle stringhe che contengono la stringa richiesta, oppure restituire il numero di occorrenze della stringa ricercata nelle stringhe della lista, ma qui usciamo dallo scopo del mio metodo e ci avviamo verso i sistemi di ricerca.