La stringa è in array?


107

Quale sarebbe il modo migliore per guardare in un string[]per vedere se contiene un elemento. Questo è stato il mio primo tentativo. Ma forse c'è qualcosa che sto trascurando. La dimensione dell'array non sarà maggiore di 200 elementi.

bool isStringInArray(string[] strArray, string key)
{
    for (int i = 0; i <= strArray.Length - 1; i++)
        if (strArray[i] == key)
            return true;
    return false;
}

Risposte:


210

Usa semplicemente il metodo Contains () già integrato:

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}

Per qualche motivo quando ho cercato per la prima volta il metodo non sono riuscito a trovarlo ... grazie.
Brad il

4
@ Brad: Questo perché è un metodo di estensione proveniente da Enumerable.
AnthonyWJones

8
Come one-liner:(new string[] { "foo", "bar" }).Contains("foo")
Denis V

8
Ancora più breve:new[] { "foo", "bar" }.Contains(foo)
Eric Bole-Feysot

25

So che questo è vecchio, ma volevo che i nuovi lettori sapessero che esiste un nuovo metodo per farlo utilizzando generici e metodi di estensione.

Puoi leggere il mio post sul blog per vedere maggiori informazioni su come farlo, ma l'idea principale è questa:

Aggiungendo questo metodo di estensione al codice:

public static bool IsIn<T>(this T source, params T[] values)
{
    return values.Contains(source);
}

puoi eseguire la tua ricerca in questo modo:

string myStr = "str3"; 
bool found = myStr.IsIn("str1", "str2", "str3", "str4");

Funziona su qualsiasi tipo (purché crei un buon metodo di uguaglianza). Qualsiasi tipo di valore di sicuro.


Ho qualcosa del genere var xxx = csvData.Rows[0].ItemArray[0].IsIn(".00", "0.0", ".25", "0.5", ".5", ".50", ".75");quello che voglio fare è guardare attraverso il datatable nella prima colonna per vedere se i valori non finiscono in nessuna delle seguenti stringhe .. se non lo fanno, voglio restituire una stringa che lo afferma manca un valore .00ad esempio usando il tuo esempio Non riesco a far funzionare questo è un po 'più complicato poiché non voglio restituire un bool Ho modificato il tuo metodo per restituire una stringa ma ancora non funziona alcun suggerimento
MethodMan

Questo sembra meglio posto come una domanda sul sito. Vai avanti e fai riferimento a questa risposta se necessario.
Gabriel McAdams

Sono stato effettivamente in grado di trovare un modo fantastico per fare ciò che volevo fare Ho scritto qualcosa che controllasse se i valori di una stringa all'interno di un ciclo for per Datatables ItemArray, finiscono con uno dei seguenti valori che avevo nel mio stringa public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
MethodMan

12

Stai semplicemente cercando la funzione Array.Exists (o il metodo di estensione Contains se stai usando .NET 3.5, che è leggermente più conveniente).


3
Ecco un esempio funzionante per .NET 2.0: if (Array.Exists (arrayToLookThrough, o => o == elementToSearchFor))
Fueled

7

Linq (per s & g's):

var test = "This is the string I'm looking for";
var found = strArray.Any(x=>x == test);

oppure, a seconda delle esigenze

var found = strArray.Any(
    x=>x.Equals(test, StringComparison.OrdinalIgnoreCase));


2

Gli array sono, in generale, una struttura dati scadente da utilizzare se si desidera chiedere se un particolare oggetto è nella raccolta o meno.

Se eseguirai questa ricerca frequentemente, potrebbe valere la pena utilizzare un Dictionary<string, something>anziché un array. Le ricerche in un dizionario sono O (1) (tempo costante), mentre la ricerca nell'array è O (N) (richiede tempo proporzionale alla lunghezza dell'array).

Anche se l'array contiene solo 200 elementi al massimo, se esegui molte di queste ricerche, il dizionario sarà probabilmente più veloce.


1
la ricerca binaria è O (log n); dizionario sottende a O (1) - ma c'è molto overhead; per le dimensioni medio-piccole, la ricerca lineare o la ricerca binaria possono avere prestazioni migliori.
Marc Gravell

1

È inoltre possibile utilizzare LINQ per eseguire l'iterazione sulla matrice. oppure puoi usare il metodo Find che richiede a un delegato di cercarlo. Tuttavia penso che il metodo di ricerca sia un po 'più costoso del semplice looping.


Il metodo Find sarà algoritmicamente identico al metodo "looping-through". Qualsiasi spesa extra sarà la creazione di oggetti e forse uno o due livelli di riferimento indiretto ma, se ti preoccupi di ottimizzarli a scapito della leggibilità, ti preoccupi delle cose sbagliate.
AwesomeTown

1

Come accennato molte volte nel thread sopra, dipende dal framework in uso. .Net Framework 3 e versioni successive hanno i metodi .Contains () o Exists () per gli array. Per altri framework di seguito, puoi eseguire il seguente trucco invece di scorrere l'array ...

((IList<string>)"Your String Array Here").Contains("Your Search String Here")

Non sono troppo sicuro dell'efficienza ... Dave


0

È più veloce dell'iterazione manuale dell'array:

static bool isStringInArray(string[] strArray, string key)
    {

        if (strArray.Contains(key))
            return true;
        return false;
    }

l'utilizzo di LINQ è più veloce rispetto all'iterazione della stringa, come è stato fatto nell'esempio. strArray.Contains (chiave) è tutto ciò che è veramente necessario
Chris Ballance

3
Dietro le quinte, strArray.Contains (key) eseguirà comunque un ciclo attraverso l'array ... non è coinvolta alcuna magia che ti tenga fuori dalla ricerca O (n).
AwesomeTown

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.