L'index du tableau existe-t-il

89

J'ai hérité d'un code au travail qui a une très mauvaise odeur. J'espère trouver la solution la plus indolore possible.

Existe-t-il un moyen de vérifier si un nombre arbitraire est un élément valide dans un tableau?

Exemple - J'ai besoin de vérifier si le tableau [25] existe.

De préférence, je préférerais faire cela sans faire un foreach () à travers le tableau pour trouver les lignes.

Existe-t-il un moyen de le faire ou suis-je coincé avec la boucle foreach?

splatto
la source
Voulez-vous dire que vous voulez savoir si une valeur pour le tableau [x] == 25? Je pense que vous déroutez les gens sur ce que vous demandez en demandant si array [25] existe. Il existe certainement s'il y a 26 éléments ou plus dans le tableau, mais je ne pense pas que ce soit ce que vous demandez.
kevin42
Le programme dans lequel je travaille a deux tableaux possibles qui ont le même nom de fichier. L'un a 21 éléments et l'autre 30 quelque chose. J'ai besoin de la valeur au tableau [25] si elle existe.
splatto

Réponses:

144

Testez la longueur

int index = 25;
if(index < array.Length)
{
    //it exists
}
Eoin Campbell
la source
3
Merci. Je ne peux pas croire que je n'ai pas pensé à la propriété .Length!
splatto
13
Assurez-vous également que l'index> = 0.
Andreas Grech
2
Et assurez-vous que le tableau lui-même n'est pas nul :)
Shimmy Weitzhandler
1
Étant donné que les index de tableau doivent être séquentiels en C #, cela est vrai. Il existe des types de collection qui n'ont pas d'index séquentiel, mais ce ne sont pas des types de tableaux de base en C #.
réor
99

Vous pouvez également utiliser LINQ pour y parvenir:

var exists = array.ElementAtOrDefault(index) != null;
Shimmy Weitzhandler
la source
4
Merci, c'est ce que je recherchais au lieu de la vérification maladroite de la longueur du tableau.
Starceaker
6
Note mineure, new object[]{ null }.ElementAtOrDefault(index)retournera nullpuisque l'élément à 0 est null . L'utilisation ElementAtOrDefaultn'est pas une excellente solution pour vérifier l' existence d' indices de tableau , cette vérification d'égalité ajoutée à la fin rend les résultats indéterminables.
Chris Marisic
@ChrisMarisic Pouvez-vous donner un exemple?
FMFF
2
@ChrisMarisic vous avez raison, au cas où vous voudriez vérifier l'existence, faites-le array.Length > index.
Shimmy Weitzhandler
2
@ChrisMarisic, en fait c'est une note majeure, des solutions comme celle-ci conduiront à des bogues cachés
amd
21

Qu'entendez-vous exactement par «est un élément valide»? Vous pouvez simplement faire:

if (array.Length >= 26)

qui vous dirait si 25 est un index valide dans le tableau ou non (en supposant une limite inférieure de 0).

Si vous avez besoin de savoir s'il est non nul ou non, utilisez simplement:

if (array[25] != null)

(ou une combinaison des deux).

Si cela ne vous aide pas, veuillez donner une signification plus précise de «valide» pour votre problème.

Jon Skeet
la source
3
pour le deuxième exemple j'ai eu ceci. Index was outside the bounds of the array
Muhammad Raheel
4
@raheel: Eh bien, il semble que vous auriez dû utiliser le premier test à la place ...
Jon Skeet
11

En supposant que vous vouliez également vérifier si l'élément n'est pas nul

if (array.Length > 25 && array[25] != null)
{
    //it exists
}
Martin Harris
la source
1
Remarque: Vous devez utiliser &&dans if (array.Length > 25 && array[25] != null), si l'utilisation de single &lancera une exception IndexOutOfRange. MSDN .
somme de contrôle du
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
}
theJerm
la source
1

Vous pouvez utiliser la longueur du tableau et voir si votre nombre arbitraire s'inscrit dans cette plage. Par exemple, si vous avez un tableau de taille 10, le tableau [25] n'est pas valide car 25 n'est pas inférieur à 10.

jean
la source
1

Vous pouvez plutôt utiliser une liste, afin de pouvoir vérifier l'existence.

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

if (l.Count == 25) {
  doStuff();
}
int num = 45;
if (l.Contains(num)) {
  doMoreStuff();
}
Jhonny D. Cano -Leftware-
la source
1

array.length vous dira combien d'éléments sont dans un tableau

Mike Miller
la source
0

Vous pouvez vérifier si l'index est inférieur à la longueur du tableau. Cela ne vérifie pas les valeurs nulles ou d'autres cas étranges où l'index peut se voir attribuer une valeur mais ne l'a pas été explicitement.

JB King
la source
0

Vous pouvez vérifier la longueur du tableau pour voir si l'élément 25 est valide dans le sens d'être dans le tableau, alors vous pouvez utiliser

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

pour voir si l'élément de tableau lui-même a été défini.

Colin Desmond
la source
0

Cela ressemble beaucoup à vous utilisez un tableau pour stocker différents champs. C'est définitivement une odeur de code. J'éviterais autant que possible d'utiliser des tableaux car ils ne sont généralement pas adaptés (ou nécessaires) dans le code de haut niveau.

Le passage à un dictionnaire simple peut être une option viable à court terme. Comme le ferait une grande classe de sac de propriété. Il existe de nombreuses options. Le problème que vous avez maintenant n'est qu'un symptôme d'une mauvaise conception, vous devriez chercher à résoudre le problème sous-jacent plutôt que de simplement corriger la mauvaise conception afin que cela fonctionne un peu, en quelque sorte, pour le moment.

Coin
la source