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?


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
}

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;

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.


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
}

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
}

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.


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();
}


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.


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.