1

コンボボックスから1つの値を取得し、リストを使用して別のコンボボックスに配置しようとしています。

リストから値を正常に削除し、他のリストに正常に実装しました。しかし、これを行うと、リストの容量が誤動作し、インデックスが範囲外のエラーになります。

シナリオ:

選択したリストレター:B

「左シフトボタンが押されました」

「B」が文字リストから削除されました

番号リストに「B」を追加

値を出力する

エラー:「インデックスが範囲外でした。負ではなく、コレクションのサイズ未満である必要があります

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

数字リスト容量:8、文字リスト容量:4。

番号リスト:1、2、3、4、B。文字リスト:A、C、D

コード:

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();
    }

}

    }

あなたが提供できるどんな助けにも感謝します。

4

2 に答える 2

5

の代わりにCountプロパティを使用しますCapacity。最初のものはリストに含まれるアイテムの数を返すからです。2つ目は、リストのサイズが変更される前に追加できるアイテムの数を示しています。

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);   
}
于 2012-10-21T00:59:51.750 に答える
1

カウントではなく容量を使用しています。容量は、リスト内の要素の数ではありません。

    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>.

ここから http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx

于 2012-10-21T01:01:53.160 に答える