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?

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

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

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

array.length dirá quantos elementos estão em um array

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

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

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

Cunha
fonte