배열의 인덱스가 존재합니까


89

나는 직장에서 정말 나쁜 냄새가 나는 코드를 물려 받았습니다. 가능한 가장 고통스럽지 않은 해결책을 찾고 싶습니다.

임의의 숫자가 배열에서 유효한 요소인지 확인하는 방법이 있습니까?

예-array [25]가 있는지 확인해야합니다.

바람직하게는 행을 찾기 위해 배열을 통해 foreach ()를 수행하지 않고이 작업을 수행하는 것이 좋습니다.

이 작업을 수행하는 방법이 있습니까, 아니면 foreach 루프가 붙어 있습니까?


array [x] == 25의 값을 알고 싶습니까? 저는 여러분이 array [25]가 존재하는지 질문함으로써 여러분이 요구하는 것에 대해 사람들을 혼란스럽게하고 있다고 생각합니다. 배열에 26 개 이상의 요소가 있으면 확실히 존재하지만, 그것이 당신이 요구하는 것이라고 생각하지 않습니다.
kevin42

내가 작업중인 프로그램에는 동일한 파일 이름을 가진 두 개의 가능한 배열이 있습니다. 하나에는 21 개의 요소가 있고 다른 하나에는 30 개의 요소가 있습니다. 존재한다면 array [25]에 값이 필요합니다.
splatto

답변:


144

길이 테스트

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

3
감사. .Length 속성을 생각하지 않았다는 것이 믿을 수 없습니다!
splatto

13
색인> = 0도 확인하십시오.
Andreas Grech

2
그리고 배열 자체가 : null이 아닌지 확인하십시오
흔들 Weitzhandler

1
배열 인덱스는 C #에서 순차적이어야하므로 이는 사실입니다. 순차 인덱스가없는 컬렉션 형식이 있지만 C #의 기본 배열 형식은 아닙니다.
reor apr

99

LINQ를 사용하여이를 달성 할 수도 있습니다.

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

4
고마워, 이것은 어색한 배열 길이 검사 대신에 내가 찾고 있던 것입니다.
Starceaker

6
마이너 노트, new object[]{ null }.ElementAtOrDefault(index)반환 null0에있는 요소부터 입니다 null . 을 사용하는 ElementAtOrDefault것은 배열 인덱스 가 존재 하는지 확인하는 데 좋은 솔루션이 아닙니다. 끝에 동등성 검사가 추가되어 결과를 확인할 수 없습니다.
Chris Marisic

@ChrisMarisic 예를 들어 주시겠습니까?
FMFF

2
@ChrisMarisic 당신이 맞아, 존재를 확인하고 싶다면 만 array.Length > index.
Shimmy Weitzhandler

2
@ChrisMarisic, 실제로 이것은 중요한 메모입니다. 이와 같은 솔루션은 숨겨진 버그로 이어질 것입니다
amd

21

"유효한 요소"란 정확히 무엇을 의미합니까? 다음과 같이 할 수 있습니다.

if (array.Length >= 26)

이는 25가 배열에 대한 유효한 인덱스인지 여부를 알려줍니다 (하한이 0이라고 가정).

null이 아닌지 여부를 알아야하는 경우 다음을 사용하십시오.

if (array[25] != null)

(또는 둘의 조합).

이것이 도움이되지 않는다면 문제에 대해 "유효"라는 더 정확한 의미를 제공하십시오.


3
두 번째 예는 이것을 얻었습니다. Index was outside the bounds of the array
Muhammad Raheel 2015 년

4
@raheel : 당신이 대신 첫 번째 테스트를 사용 했어야처럼 글쎄 그것은 ... 소리
존 소총

11

항목이 null이 아닌지 확인하고 싶다고 가정합니다.

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

1
참고 :있어 사용하기 &&if (array.Length > 25 && array[25] != null)사용 하나이 경우, &IndexOutOfRange 예외를 throw합니다. MSDN .
체크섬

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

배열의 길이를 사용하고 임의의 숫자가 해당 범위에 맞는지 확인할 수 있습니다. 예를 들어, 크기가 10 인 배열이있는 경우 25가 10보다 작지 않기 때문에 array [25]는 유효하지 않습니다.


1

오히려 List를 사용하여 존재 여부를 확인할 수 있습니다.

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

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


0

인덱스가 배열의 길이보다 작은 지 확인할 수 있습니다. 이것은 인덱스에 값을 할당 할 수 있지만 명시 적으로 부여하지 않은 널 또는 기타 이상한 경우를 확인하지 않습니다.


0

배열의 길이를 확인하여 항목 25가 배열에 있다는 의미에서 유효한지 확인할 수 있습니다.

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

배열 항목 자체가 설정되었는지 확인합니다.


0

다른 필드를 저장하기 위해 배열을 사용하는 것과 매우 흡사합니다. 이것은 확실히 코드 냄새입니다. 일반적으로 고수준 코드에 적합하지 않거나 필요하지 않으므로 가능한 한 배열을 사용하지 않습니다.

간단한 사전으로 전환하는 것은 단기적으로 실행 가능한 옵션이 될 수 있습니다. 큰 속성 가방 클래스를 사용하는 것과 같습니다. 많은 옵션이 있습니다. 현재 가지고있는 문제는 잘못된 디자인의 증상 일뿐입니다. 현재로서는 잘못된 디자인을 패치하는 것보다 근본적인 문제를 수정하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.