Index of Array esiste


91

Ho ereditato del codice al lavoro che ha un cattivo odore. Spero di trovare la soluzione più indolore possibile.

C'è un modo per verificare se un numero arbitrario è un elemento valido in un array?

Esempio: devo controllare se l'array [25] esiste.

Preferibilmente preferirei farlo senza fare un foreach () attraverso l'array per trovare le righe.

C'è un modo per farlo o sono bloccato con foreach loop?


Vuoi dire che vuoi sapere se un valore per array [x] == 25? Penso che tu stia confondendo le persone su ciò che stai chiedendo chiedendo se array [25] esiste. Certamente esiste se ci sono 26 o più elementi nell'array, ma non credo che sia quello che stai chiedendo.
kevin42

Il programma in cui sto lavorando ha due possibili array che hanno lo stesso nome di file. Uno ha 21 elementi e l'altro ha 30qualcosa. Ho bisogno del valore in array [25] se dovesse esistere.
splatto

Risposte:


145

Prova la lunghezza

int index = 25;
if(index < array.Length)
{
    //it exists
}

3
Grazie. Non posso credere di non aver pensato alla proprietà .Length!
splatto

13
Assicurati anche che index> = 0.
Andreas Grech

2
E assicurati che l'array stesso non sia nullo :)
Shimmy Weitzhandler

1
Poiché gli indici di array devono essere sequenziali in C #, ciò è vero. Esistono tipi di raccolta che non dispongono di indici sequenziali, ma non sono tipi di matrice di base in C #.
reor

106

Puoi usare LINQ anche per ottenere questo:

var exists = array.ElementAtOrDefault(index) != null;

4
Grazie, questo è quello che stavo cercando invece del maldestro controllo della lunghezza dell'array.
Starceaker

7
Nota minore, new object[]{ null }.ElementAtOrDefault(index)verrà restituito nullpoiché l'elemento a 0 è null . L'uso ElementAtOrDefaultnon è un'ottima soluzione per controllare l' esistenza degli indici di array , il controllo di uguaglianza aggiunto alla fine rende i risultati indeterminabili.
Chris Marisic,

@ChrisMarisic Puoi fare un esempio?
FMFF

2
@ChrisMarisic hai ragione, nel caso in cui vuoi verificare l'esistenza fallo solo array.Length > index.
Shimmy Weitzhandler

2
@ChrisMarisic, in realtà questa è una nota importante, soluzioni come questa porteranno a bug nascosti
amd

21

Cosa intendi esattamente con "è un elemento valido"? Potresti semplicemente fare:

if (array.Length >= 26)

che ti direbbe se 25 è un indice valido nell'array o meno (assumendo un limite inferiore 0).

Se hai bisogno di sapere se non è nullo o meno, usa semplicemente:

if (array[25] != null)

(o una combinazione dei due).

Se questi non aiutano, si prega di dare un significato più preciso di "valido" per il problema.


3
per secondo esempio ho capito. Index was outside the bounds of the array
Muhammad Raheel

4
@raheel: Bene, allora sembra che avresti dovuto usare il primo test invece ...
Jon Skeet

12

Supponendo che tu voglia anche controllare se l'articolo non è nullo

if (array.Length > 25 && array[25] != null)
{
    //it exists
}

1
Nota: Got da utilizzare &&in if (array.Length > 25 && array[25] != null), se l'uso singola &lancerà un'eccezione IndexOutOfRange. MSDN .
checksum

3
// I'd modify this slightly to be more resilient to a bad parameter
// it will handle your case and better handle other cases given to it:

int index = 25;

if (index >= 0 && index < array.Length)
{
    // Array element found
}

1

Puoi usare la lunghezza dell'array e vedere se il tuo numero arbitrario rientra in quell'intervallo. Ad esempio, se si dispone di un array di dimensione 10, array [25] non è valido perché 25 non è inferiore a 10.


1

Puoi piuttosto usare un elenco, in modo da poter verificare l'esistenza.

List<int> l = new List<int>();
l.Add(45);
...
...

if (l.Count == 25) {
  doStuff();
}
int num = 45;
if (l.Contains(num)) {
  doMoreStuff();
}


0

È possibile verificare se l'indice è inferiore alla lunghezza dell'array. Questo non controlla i valori nulli o altri casi dispari in cui all'indice può essere assegnato un valore ma non ne è stato assegnato uno esplicitamente.


0

Puoi controllare la lunghezza dell'array per vedere se l'elemento 25 è valido nel senso di essere nell'array, quindi potresti usare

if (array.Length > 25)
{ 
   if (array[25] != null)
   {
       //good
   }
}

per vedere se l'elemento dell'array stesso è stato impostato.


0

Sembra proprio che tu stia usando un array per memorizzare diversi campi. Questo è sicuramente un odore di codice. Eviterei di usare gli array il più possibile in quanto generalmente non sono adatti (o necessari) nel codice di alto livello.

Il passaggio a un semplice dizionario può essere un'opzione praticabile a breve termine. Come se si usasse una grande classe di borsa delle proprietà. Ci sono molte opzioni. Il problema che hai ora è solo un sintomo di una cattiva progettazione, dovresti cercare di risolvere il problema sottostante piuttosto che semplicemente correggere il cattivo design in modo che funzioni per lo più, per ora.

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.