2009-02-01 4 views
84

Quale sarebbe il modo migliore per cercare 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.La stringa è nell'array?

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

risposta

169

Basta usare il già incorporato metodo contains():

using System.Linq; 

//... 

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

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

+4

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

+47

È necessario includere System.Linq perché funzioni. –

1

È inoltre possibile utilizzare LINQ per scorrere la matrice. oppure puoi utilizzare il metodo Trova che richiede a un delegato di cercarlo. Comunque penso che il metodo di ricerca sia un po 'più costoso di un semplice passaggio.

+0

Il metodo di ricerca sarà algoritmicamente identico al metodo di" looping-through ". Qualsiasi spesa aggiuntiva sarà la creazione di alcuni 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. –

6

L'array è ordinato? Se è così potresti fare un binary search. Ecco the .NET implementation as well. Se l'array è ordinato, una ricerca binaria migliorerà le prestazioni rispetto a qualsiasi soluzione iterativa.

+0

Bene, O (N) a O (log n) ;-p –

+0

Ho rimosso il mio iperbolico "esponenzialmente" :) –

12

Si sta semplicemente dopo la funzione Array.Exists (o il metodo di estensione Contiene se si utilizza .NET 3.5, che è leggermente più conveniente).

+3

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

6

Linq (per s & g di):

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

o, a seconda delle esigenze

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

Questo è più veloce iterazione attraverso l'array manualmente:

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

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

E questo è più veloce come? – senfo

+0

utilizzando LINQ è più veloce di iterare attraverso la stringa come è stato fatto nell'esempio. strArray.Contains (chiave) è tutto ciò che è veramente necessario –

+2

Dietro le quinte, strArray.Contains (chiave) sta andando a scorrere l'array in ogni caso ... non c'è nessuna magia implicata che ti faccia uscire da una O (n) ricerca. –

2

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

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

Anche se l'array contiene al massimo 200 elementi, se si eseguono molte ricerche, il dizionario sarà probabilmente più veloce.

+1

binary-search è O (log n); dizionario ** sottomette ** a O (1) - ma c'è un sacco di spese generali; per le ricerche di piccole e medie dimensioni, la ricerca lineare o la ricerca binaria possono essere superate. –

1

Come accennato più volte nella discussione sopra, dipende dal framework in uso. . Net Framework 3 e versioni successive dispone dei metodi .Contains() o Exists() per gli array. Per altri framework di seguito, può fare il seguente trucco, invece di loop all'interno di un array ...

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

Non troppo sicuro sull'efficienza ... Dave

20

So che questo è vecchio, ma ho voluto il nuovo i lettori di sapere che esiste un nuovo metodo per farlo usando i metodi di generica e di estensione.

Potete leggere la mia blog post per visualizzare ulteriori informazioni su come fare questo, ma l'idea principale è questo:

Con l'aggiunta di questo metodo di estensione per il tuo codice:

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

è possibile eseguire la vostra ricerca in questo modo:

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

Funziona su qualsiasi tipo (purché si crei un metodo di equo buono). Qualsiasi tipo di valore di sicuro.

+0

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

+0

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

+0

Ero davvero in grado di trovare un modo fantastico per fare quello che volevo fare Ho scritto qualcosa che avrebbe controllato se i valori di una stringa all'interno di un ciclo for per il DataArray Datatables terminava con uno dei seguenti valori che avevo in la mia stringa 'booster statico pubblico EndWithValue (questo valore stringa, valori IEnumerable ) { valori restituiti.Qualsiasi (elemento => valore.EndsWith (elemento)); } ' – MethodMan