Czy istnieje indeks tablicy


89

Odziedziczyłem w pracy kod, który ma naprawdę brzydki zapach. Mam nadzieję, że znajdę możliwie najbardziej bezbolesne rozwiązanie.

Czy istnieje sposób sprawdzenia, czy jakaś dowolna liczba jest prawidłowym elementem w tablicy?

Przykład - muszę sprawdzić, czy istnieje tablica [25].

Najlepiej byłoby to zrobić bez wykonywania foreach () przez tablicę w celu znalezienia wierszy.

Czy jest jakiś sposób, aby to zrobić, czy też utknąłem w pętli foreach?


Masz na myśli, że chcesz wiedzieć, czy jakaś wartość dla tablicy [x] == 25? Myślę, że wprowadzasz ludzi w błąd co do tego, o co prosisz, pytając, czy istnieje tablica [25]. Z pewnością istnieje, jeśli w tablicy jest 26 lub więcej elementów, ale nie sądzę, że o to prosisz.
kevin42

Program, w którym pracuję, ma dwie możliwe tablice, które mają taką samą nazwę pliku. Jeden ma 21 elementów, a drugi 30. Potrzebuję wartości w tablicy [25], jeśli istnieje.
splatto

Odpowiedzi:


144

Sprawdź długość

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

3
Dzięki. Nie mogę uwierzyć, że nie pomyślałem o właściwości .Length!
splatto

13
Upewnij się, że indeks> = 0 również.
Andreas Grech

2
I upewnij się, że sama tablica nie jest zerowa :)
Shimmy Weitzhandler

1
Ponieważ indeksy tablic muszą być sekwencyjne w C #, jest to prawda. Istnieją typy kolekcji, które nie mają indeksów sekwencyjnych, ale nie są to podstawowe typy tablic w C #.
powtórz

99

Możesz użyć LINQ, aby to osiągnąć:

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

4
Dzięki, właśnie tego szukałem zamiast niezdarnego sprawdzania długości tablicy.
Starceaker,

6
Drobna uwaga, new object[]{ null }.ElementAtOrDefault(index)zwróci, nullponieważ element o wartości 0 to null . Korzystanie ElementAtOrDefaultnie jest doskonałym rozwiązaniem dla sprawdzenia indeksy tablicy istnieje , to sprawdzenie równości dodany do końca sprawia, że wyniki ustalić w wiarygodny sposób.
Chris Marisic

@ChrisMarisic Czy możesz podać przykład?
FMFF

2
@ChrisMarisic masz rację, jeśli chcesz sprawdzić tylko istnienie array.Length > index.
Shimmy Weitzhandler

2
@ChrisMarisic, właściwie to jest ważna uwaga, takie rozwiązania prowadzą do ukrytych błędów
amd

21

Co dokładnie masz na myśli, mówiąc „jest prawidłowym elementem”? Możesz po prostu zrobić:

if (array.Length >= 26)

co powie ci, czy 25 jest prawidłowym indeksem tablicy, czy nie (zakładając dolną granicę 0).

Jeśli chcesz wiedzieć, czy nie jest to null, czy nie, po prostu użyj:

if (array[25] != null)

(lub połączenie tych dwóch).

Jeśli to nie pomoże, podaj bardziej precyzyjne znaczenie słowa „ważny” dla twojego problemu.


3
na przykład mam to. Index was outside the bounds of the array
Muhammad Raheel

4
@raheel: Cóż, to brzmi tak, jakbyś zamiast tego użył pierwszego testu ...
Jon Skeet

11

Zakładając, że chcesz również sprawdzić, czy element nie jest pusty

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

1
Uwaga: należy użyć &&w if (array.Length > 25 && array[25] != null), jeśli użycie pojedynczego &spowoduje zgłoszenie wyjątku IndexOutOfRange. MSDN .
suma kontrolna

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

Możesz użyć długości tablicy i sprawdzić, czy Twoja dowolna liczba mieści się w tym zakresie. Na przykład, jeśli masz tablicę o rozmiarze 10, to tablica [25] jest nieprawidłowa, ponieważ 25 nie jest mniejsze niż 10.


1

Możesz raczej użyć listy, aby sprawdzić istnienie.

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

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


0

Możesz sprawdzić, czy indeks jest mniejszy niż długość tablicy. Nie sprawdza to wartości null ani innych nieparzystych przypadków, w których indeksowi można przypisać wartość, ale nie została ona nadana jawnie.


0

Możesz sprawdzić długość tablicy, aby zobaczyć, czy pozycja 25 jest poprawna w tym sensie, że znajduje się w tablicy, wtedy możesz użyć

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

aby sprawdzić, czy sam element tablicy został ustawiony.


0

Wygląda na to, że używasz tablicy do przechowywania różnych pól. To zdecydowanie zapach kodu. Unikałbym używania tablic tak często, jak to możliwe, ponieważ generalnie nie są one odpowiednie (lub potrzebne) w kodzie wysokiego poziomu.

Przejście do prostego słownika może być praktyczną opcją w krótkim okresie. Tak jak przy użyciu klasy worków typu big property. Istnieje wiele opcji. Problem, który masz teraz, jest tylko symptomem złego projektu, powinieneś spojrzeć na naprawienie podstawowego problemu, a nie tylko łatanie złego projektu, aby to trochę, trochę w większości działało, na razie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.