O índice da matriz existe


91

Eu herdei alguns códigos no trabalho que realmente cheiram mal. Espero encontrar a solução mais indolor possível.

Existe uma maneira de verificar se algum número arbitrário é um elemento válido em uma matriz?

Exemplo - preciso verificar se existe array [25].

De preferência, eu preferiria fazer isso sem fazer um foreach () no array para encontrar as linhas.

Existe alguma maneira de fazer isso ou estou preso com o loop foreach?


Você quer saber se algum valor para array [x] == 25? Acho que você está confundindo as pessoas sobre o que está pedindo ao perguntar se o array [25] existe. Certamente existe se houver 26 ou mais elementos no array, mas não acho que seja isso que você está pedindo.
kevin42,

O programa no qual estou trabalhando tem duas matrizes possíveis com o mesmo nome de arquivo. Um tem 21 elementos e o outro tem 30 algo. Preciso do valor em array [25], caso exista.
splatto

Respostas:


145

Teste o comprimento

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

3
Obrigado. Não acredito que não pensei na propriedade .Length!
splatto

13
Certifique-se de que o índice seja> = 0 também.
Andreas Grech,

2
E certifique-se de que a matriz em si não é nula :)
Shimmy Weitzhandler

1
Como os índices de matriz devem ser sequenciais em C #, isso é verdade. Existem tipos de coleção que não têm índices sequenciais, mas não são tipos básicos de Array em C #.
reor

106

Você também pode usar o LINQ para conseguir isso:

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

4
Obrigado, isso é o que eu estava procurando em vez da verificação desajeitada do comprimento da matriz.
Starceaker

7
A nota secundária new object[]{ null }.ElementAtOrDefault(index)retornará, nullpois o elemento em 0 é null . Usando ElementAtOrDefaultnão é uma boa solução para o controlo índices de matriz existe , que verificação da igualdade adicionado ao final faz com que os resultados indeterminada.
Chris Marisic

@ChrisMarisic Você pode dar um exemplo?
FMFF

2
@ChrisMarisic você está certo, caso queira checar a existência só faça array.Length > index.
Shimmy Weitzhandler

2
@ChrisMarisic, na verdade esta é uma observação importante, soluções como essa levarão a bugs ocultos
amd

21

O que exatamente você quer dizer com "é um elemento válido"? Você poderia apenas fazer:

if (array.Length >= 26)

que diria se 25 é um índice válido para a matriz ou não (assumindo um limite inferior 0).

Se você precisa saber se é não nulo ou não, basta usar:

if (array[25] != null)

(Ou uma combinação dos dois).

Se isso não ajudar, forneça um significado mais preciso de "válido" para o seu problema.


3
para o segundo exemplo eu tenho isso. Index was outside the bounds of the array
Muhammad Raheel

4
@raheel: Bem, então parece que você deveria ter usado o primeiro teste em vez disso ...
Jon Skeet

12

Supondo que você também deseja verificar se o item não é nulo

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

1
Nota: Tem que usar &&em if (array.Length > 25 && array[25] != null), se usar único &irá lançar a exceção IndexOutOfRange. MSDN .
soma de verificação

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

Você pode usar o comprimento da matriz e ver se o seu número arbitrário se encaixa nesse intervalo. Por exemplo, se você tem um array de tamanho 10, então array [25] não é válido porque 25 não é menor que 10.


1

Você pode preferir usar uma lista, para que possa verificar a existência.

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

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


0

Você pode verificar se o índice é menor que o comprimento da matriz. Isso não verifica se há nulos ou outros casos estranhos em que o índice pode receber um valor, mas não foi fornecido explicitamente.


0

Você pode verificar o comprimento da matriz para ver se o item 25 é válido no sentido de estar na matriz, então você pode usar

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

para ver se o próprio item da matriz foi definido.


0

Parece que você está usando uma matriz para armazenar campos diferentes. Este é definitivamente um cheiro de código. Eu evitaria usar arrays tanto quanto possível, pois geralmente eles não são adequados (ou necessários) em código de alto nível.

Mudar para um dicionário simples pode ser uma opção viável a curto prazo. Da mesma forma que usar uma grande classe de bolsa de propriedades. Existem muitas opções. O problema que você tem agora é apenas um sintoma de um design ruim, você deve procurar consertar o problema subjacente em vez de apenas corrigir o design ruim para que funcione de certa forma, mais ou menos, por enquanto.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.