¿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?

splatto
fuente
¿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
}
Eoin Campbell
fuente
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;
Shimmy Weitzhandler
fuente
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.

Jon Skeet
fuente
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
}
Martin Harris
fuente
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
}
theJerm
fuente
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.

vaquero
fuente
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();
}
Jhonny D. Cano -Leftware-
fuente
1

array.length te dirá cuántos elementos hay en una matriz

Mike Miller
fuente
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.

JB King
fuente
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.

Colin Desmond
fuente
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.

Cuña
fuente