2010-04-05 13 views
14

Diciamo che ho un # variabile e la matrice C:Confronto di un valore con una matrice intera? (C#)

int variable_1 = 1; 
int[3] array_1 = {1,2,3}; 

Come posso verificare se il valore di Variabile_1 è uguale a qualsiasi dei valori in array_1 senza scorrendo matrice_1?

+4

In generale, per verificare l'esistenza all'interno di una struttura multi-valore richiederà una certa quantità di loop. Se hai trovato un collo di bottiglia nell'applicazione (per mezzo di un profilo) con un ciclo, puoi aggiungere un indice per farlo andare più veloce. In .NET, il modo più semplice per farlo è probabilmente un dizionario o HashSet. –

risposta

26

Bene qualcosa deve effettuare il ciclo. Una qualsiasi delle seguenti funzionerà:

bool exists = array.Contains(variable_1); 
bool exists = Array.IndexOf(array_1, variable_1) != -1; 
bool exists = Array.Exists(array_1, x => x == variable_1); 
bool exists = Array.FindIndex(array_1, x => x == variable_1) != -1; 
bool exists = array_1.Any(x => x == variable_1); 

Tutte le versioni utilizzando un'espressione lambda voglia eccessivo per me, ma sono potenzialmente utile se vi trovate in una situazione in cui non si conosce il valore effettivo stai cercando - solo alcune condizioni.

Se si sa che l'array è ordinato, è possibile utilizzare:

bool exists = Array.BinarySearch(array_1, variable_1) >= 0; 

Questo sarà O (log n) piuttosto che O (n) (che tutti gli altri lo sono), ma richiede la matrice da ordinare prima.

Personalmente normalmente andrei con il primo modulo, supponendo che tu stia utilizzando .NET 3.5 o versione successiva.

Se è necessario verificare la presenza di diversi elementi e la matrice è di grandi dimensioni, si consiglia di creare un HashSet<int>:

HashSet<int> hashSet = new HashSet<int>(array_1); 
bool exists = hashSet.Contains(variable_1); 
18

a 3,5 e fino

array_1.Contains(variable_1); 

o 2,0

array_1.IndexOf(variable_1) != -1 

Aggiornato: per risparmiare sulle prestazioni

+6

Creare un nuovo elenco solo per il gusto di trovare un valore mi sembra eccessivo. Anche in 2.0 puoi usare Array.IndexOf, Array.Exists, Array.FindIndex ecc. –

+0

In effetti! array_1.IndexOf (variable_1)! = -1 dovrebbe fare il lavoro –

1

mmm ci possono essere varie opzioni,

var hasItem = Array.Exists(array_1, x => x == variable_1); 
Problemi correlati