2010-06-16 5 views
0

폴더에 이미지 위치 목록이 있습니다.목록을 반복하는 동안 인덱스가 범위 밖으로 벗어남 <string>

나는 사용자가 주어진 폴더의 이미지를 훑어 볼 수있는 커버 플로우 유형 영역을 에뮬레이트하는 다섯 개의 pictureBox를 가지고있다.

컬렉션의 첫 번째 이미지가 첫 번째 그림 상자로 설정되어 있고 cycleLeft()를 클릭하면 오류가 발생한다는 것을 알고 있습니다. 음수가 있습니다.

어떻게해야합니까? 예를 들어, 목록의 첫 번째 이미지가 이미 가장 왼쪽으로 설정되어 있고 누군가가 왼쪽으로 넘기는 경우 첫 번째 이미지를 목록의 마지막 위치에 놓습니다.

어떤 안내?

private void leftArrow_Click(object sender, EventArgs e) 
    { 
     cycleImagesLeft(); 
    } 

    private void rightArrow_Click(object sender, EventArgs e) 
    { 
     cycleImagesRight(); 
    } 

    public void cycleImagesLeft() 
    { 
     //imageThree is the center image, that's why I use it as a frame of reference. 
     int currentImage = pictures.IndexOf(imageThree.ImageLocation); 
     imageOne.ImageLocation = pictures[currentImage - 3]; 
     imageTwo.ImageLocation = pictures[currentImage - 2]; 
     imageThree.ImageLocation = pictures[currentImage - 1]; 
     imageFour.ImageLocation = pictures[currentImage]; 
     imageFive.ImageLocation = pictures[currentImage + 1]; 
    } 

    public void cycleImagesRight() 
    { 
     int currentImage = pictures.IndexOf(imageThree.ImageLocation); 
     imageOne.ImageLocation = pictures[currentImage - 1]; 
     imageTwo.ImageLocation = pictures[currentImage]; 
     imageThree.ImageLocation = pictures[currentImage + 1]; 
     imageFour.ImageLocation = pictures[currentImage + 2]; 
     imageFive.ImageLocation = pictures[currentImage + 3]; 
    } 

답변

2

음, 하나의 옵션은 값이 범위 내에 항상 있는지 확인하기 위해 도우미 메서드를 사용하는 것입니다 : 다음

string GetPictureAt(int index) 
{ 
    // Copes with values which are two large or too small, 
    // but only as far as -pictures.Length 
    if (index < 0) 
    { 
     index += pictures.Length; 
    } 
    return pictures[index % pictures.Length]; 
} 

:

public void CycleImagesLeft() 
{ 
    int currentImage = pictures.IndexOf(imageThree.ImageLocation); 
    imageOne.ImageLocation = GetPictureAt(currentImage - 3); 
    imageTwo.ImageLocation = GetPictureAt(currentImage - 2); 
    // etc 
} 

CycleImagesRight()과 동일 . I 생각하면이 원하는대로되지만 나는 두 번째 문장을 따라 가지 않았습니다.

여전히 5 장 미만의 사진이있을 가능성을 고려해야합니다.

+0

존, 내리스트 사진의 .Count 속성을 사용 하시겠습니까? –

+0

Jon,이 방법은 100 % 정상적으로 작동하지만 모듈러스 연산자가 왜이 상황에서 작동하는지 이해하지 못합니다. 나는 그것을 사용하는 것이 분할 후에 남은 자들을 찾는 것이라고 생각했다; 이 마술은 어떻게 작동합니까? –

+0

@Sergio Tapia : Modulus는 인덱스가 항상 0과'List.Length' 사이의 범위에 있음을 보장합니다. – R0MANARMY

0
imageOne.ImageLocation = (currentImage - 3 < 0) ? null : pictures[currentImage - 3]; 
.... 
imageFour.ImageLocation = (currentImage + 2 >= pictures.Count) ? null : pictures[currentImage + 2]; 

1

항상 Circular List을 사용할 수 있습니다. 적어도 모든 인덱스 관리 항목은 추출 가능하고 재사용 가능한 클래스로 추상화됩니다.

+0

+1 이미 만들어진 바퀴를 보여줍니다. 이 질문은 생각하는 것이 재미 있지만, 수천 번 전에 해결되었습니다. –

관련 문제