2012-10-21 6 views
1

콤보 상자에서 하나의 값을 검색하여 목록을 사용하여 다른 콤보 상자에 넣으려고합니다.목록 인덱스 초과 범위

나는 성공적으로 목록에서 값을 제거하고 다른 목록 벌금으로 구현합니다. 그러나이 작업을 수행 할 때 목록 용량이 오작동하고 색인이 범위 밖으로 벗어납니다.

시나리오 :

List Letter Selected: B

'Left Shift Button Pressed'

'B' Removed from Letters List

'B' Added to Numbers List

Print Out Values

Error: "Index was out of range. Must be non-negative and less than the size of collection

Line 66: Console.WriteLine("Numbers: " + numbers[i] + "\tIteration: " + i);

Number List Capacity: 8, Letters List Capacity: 4.

Number List: 1, 2, 3, 4, B. Letters List: A, C, D

CODE : 당신이 제공 할 수있는 어떤 도움

public partial class Form1 : Form 
{ 
    public List<string> letters = new List<string>(); 
    public List<string> numbers = new List<string>(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     InitialiseLists(); 
     LoadListsIntoCombo(); 
    } 

    public void InitialiseLists() 
    { 
     /* 
     * Add Letter Data 
     */ 
     letters.Add("A"); 
     letters.Add("B"); 
     letters.Add("C"); 
     letters.Add("D"); 

     /* 
     * Add Number Data 
     */ 
     numbers.Add("1"); 
     numbers.Add("2"); 
     numbers.Add("3"); 
     numbers.Add("4"); 

    } 

    public void LoadListsIntoCombo() 
    { 

     comboLetter.DataSource = letters; 
     comboNumber.DataSource = numbers; 

    } 

    public void PrintList() 
    { 
     /* 
     * Print Lists To Console 
     */ 
     for (int i = 0; i < numbers.Capacity; i++) 
     { 
      Console.WriteLine("NUM CAPACITY: " + numbers.Capacity); 
      Console.WriteLine("Numbers: " + numbers[i] + "\tIteration: " + i); 
     } 

     for (int i = 0; i < letters.Capacity; i++) 
     { 
      Console.WriteLine("LET CAPACITY: " + letters.Capacity); 
      Console.WriteLine("Letters : " + letters[i] + "\tIteration: " + i); 

     } 

    } 


    private void cmdLeft_Click(object sender, EventArgs e) 
    { 

     AddLetterToNumber(GetLetter()); 
     RemoveLetter(GetLetter()); 

    } 

    public void RemoveLetter(string value) 
    { 
     letters.Remove(value); 
    } 

    public void AddLetterToNumber(string value) 
    { 
     numbers.Add(value); 
    } 

    public string GetLetter() 
    { 
     string letter = comboLetter.SelectedItem.ToString(); 
     return letter; 
    } 

    public int GetLetterIndex() 
    { 
     int letterIndex = comboLetter.SelectedIndex; 

     return letterIndex; 
    } 

    private void cmdRight_Click(object sender, EventArgs e) 
    { 
     PrintList(); 
    } 

} 

    } 

많은 감사합니다.

답변

5

Capacity 대신 Count 속성을 사용하십시오. 첫 번째 것은 목록에 포함 된 항목의 수를 반환하기 때문입니다. 두 번째는 목록의 크기를 조정하기 전에 추가 할 수있는 항목의 수만 표시됩니다.

public void PrintList() 
{ 
    Console.WriteLine("Numbers count: " + numbers.Count);  
    for (int i = 0; i < numbers.Count; i++) 
     Console.WriteLine("Numbers: {0}\tIteration: {1}", numbers[i], i);  

    Console.WriteLine("Letters count: " + letters.Count);  
    for (int i = 0; i < letters.Count; i++)  
     Console.WriteLine("Letters : {0}\tIteration: {1}", letters[i], i); 
} 
+1

또는'foreach' 절에서

Capacity: Gets or sets the total number of elements the internal data structure can hold without resizing. Count: Gets the number of elements actually contained in the List<T>. 

. –

+0

그런 빠른 답장을 보내 주셔서 대단히 감사합니다. 감사드립니다. 제한 시간 이후에 수락합니다. – speak

+0

@LuiggiMendoza 총계가 루프 밖에서 표시되도록 이동했습니다. OP가 인덱스를 표시하기를 원하기 때문에'for' 루프가 좋기 때문에 –

관련 문제