¿Existe el índice de matriz?


89

He heredado un código en el trabajo que huele muy mal. Espero encontrar la solución más indolora posible.

¿Hay alguna forma de verificar si algún número arbitrario es un elemento válido en una matriz?

Ejemplo: necesito comprobar si existe la matriz [25].

Preferiblemente, preferiría hacer esto sin hacer un foreach () a través de la matriz para encontrar las filas.

¿Hay alguna forma de hacer esto, o estoy atascado con foreach loop?


¿Quiere decir que quiere saber si algún valor para la matriz [x] == 25? Creo que está confundiendo a la gente acerca de lo que está pidiendo al preguntar si existe array [25]. Ciertamente existe si hay 26 o más elementos en la matriz, pero no creo que eso sea lo que estás pidiendo.
kevin42

El programa en el que estoy trabajando tiene dos posibles matrices que tienen el mismo nombre de archivo. Uno tiene 21 elementos y el Otro tiene 30 algo. Necesito el valor en la matriz [25] si existe.
splatto

Respuestas:


144

Prueba la longitud

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

3
Gracias. No puedo creer que no haya pensado en la propiedad .Length.
splatto

13
Asegúrese de que index> = 0 también.
Andreas Grech

2
Y asegúrese de que la matriz en sí no sea nula :)
Shimmy Weitzhandler

1
Debido a que se requiere que los índices de matriz sean secuenciales en C #, esto es cierto. Hay tipos de colección que no tienen índices secuenciales, pero esos no son tipos básicos de Array en C #.
reor

99

También puede usar LINQ para lograr eso:

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

4
Gracias, esto es lo que estaba buscando en lugar de la torpe verificación de la longitud de la matriz.
Starceaker

6
Nota menor, new object[]{ null }.ElementAtOrDefault(index)volverá nullya que el elemento en 0 es null . Usar ElementAtOrDefaultno es una gran solución para verificar que existen índices de matriz , esa verificación de igualdad agregada al final hace que los resultados sean indeterminables.
Chris Marisic

@ChrisMarisic ¿Puede dar un ejemplo?
FMFF

2
@ChrisMarisic tienes razón, en caso de que quieras comprobar la existencia, solo hazlo array.Length > index.
Shimmy Weitzhandler

2
@ChrisMarisic, en realidad esta es una nota importante, soluciones como esta conducirán a errores ocultos
amd

21

¿Qué quiere decir exactamente con "es un elemento válido"? Podrías simplemente hacer:

if (array.Length >= 26)

que le diría si 25 es un índice válido en la matriz o no (asumiendo un límite inferior 0).

Si necesita saber si no es nulo o no, simplemente use:

if (array[25] != null)

(O una combinación de los dos).

Si esto no ayuda, proporcione un significado más preciso de "válido" para su problema.


3
para el segundo ejemplo tengo esto. Index was outside the bounds of the array
Muhammad Raheel

4
@raheel: Bueno, entonces parece que deberías haber estado usando la primera prueba en su lugar ...
Jon Skeet

11

Suponiendo que también desea verificar si el elemento no es nulo

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

1
Nota: dieron a usar &&en if (array.Length > 25 && array[25] != null), si un solo uso &tirará IndexOutOfRange excepción. MSDN .
suma de comprobación

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

Puede usar la longitud de la matriz y ver si su número arbitrario encaja en ese rango. Por ejemplo, si tiene una matriz de tamaño 10, la matriz [25] no es válida porque 25 no es menor que 10.


1

Puede utilizar una lista para comprobar la existencia.

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

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


0

Puede verificar si el índice es menor que la longitud de la matriz. Esto no comprueba si hay nulos u otros casos extraños en los que se puede asignar un valor al índice pero no se le ha dado uno explícitamente.


0

Puede verificar la longitud de la matriz para ver si el elemento 25 es válido en el sentido de estar en la matriz, entonces podría usar

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

para ver si se ha configurado el elemento de la matriz.


0

Parece como si estuvieras usando una matriz para almacenar diferentes campos. Este es definitivamente un olor a código. Evitaría usar matrices tanto como sea posible, ya que generalmente no son adecuadas (o necesarias) en código de alto nivel.

Cambiar a un diccionario simple puede ser una opción viable a corto plazo. Como lo haría con una clase de bolsa de propiedad grande. Hay muchas opciones. El problema que tiene ahora es solo un síntoma de un mal diseño, debería buscar solucionar el problema subyacente en lugar de simplemente reparar el mal diseño para que funcione un poco, por ahora.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.