0

プログラムに次のコードがあり、yearList.SetValue(years [count]、count);の行で範囲外の例外をスローしています。

protected void invoiceYear_DataBound(object sender, EventArgs e)
        {
           //invoiceYear.SelectedItem.Value= GetYearRange();
            String[] years = GetYearRange().Split(new char[] { '[', ',', ']',' ' });
            ListItem [] yearList = new ListItem[]{};
            System.Diagnostics.Debug.WriteLine("years-->" + years.Length);
            for (int i = 0; i < years.Length; i++)
            {
                System.Diagnostics.Debug.WriteLine("years-->" + years.GetValue(i));

            }
            int count = 0;
            foreach (String str in years)
            {
                if (string.IsNullOrEmpty(str))
                    System.Diagnostics.Debug.WriteLine("empty");
                else
                {
                    yearList.SetValue(years[count], count);
                    count++;
                }
            }

            //System.Diagnostics.Debug.WriteLine("yearList-->" + yearList.GetValue(0));
            //invoiceYear.Items.AddRange(yearList);
        }
4

3 に答える 3

7

あなたは質問をしていないので、あなたの質問は単に「なぜ」だと思います。

yearList空の配列として定義されています:

ListItem [] yearList = new ListItem[]{};

長さは常にゼロです。したがって、設定する要素がないため、その要素を設定することはできません。

アップデート

「しかし、動的配列を宣言する方法がわかりませんか??」

.NETには動的配列はありません。シナリオに応じて、さまざまなコレクションタイプがあります。私はそれList<ListItem>がおそらくあなたが望むものであることを提案します。

List<ListItem> yearList = new List<ListItem>(); // An empty list

それで

yearList.Add(years[count]); // Adds an element to the end of the list.

あるいは、そのループ全体を次のように書く方がよいでしょう。

        foreach (String str in years)
        {
            if (string.IsNullOrEmpty(str))
                System.Diagnostics.Debug.WriteLine("empty");
            else
            {
                yearList.Add(str);
            }
        }

そうすれば、心配する必要はなくcount、ステップから外れることもありません(strに何かが含まれている場合にのみカウントをインクリメントするため、これはおそらくあなたが望むものではないためです)

UPDATE 2 最後に配列がどうしても必要な場合は、を使用してリストを配列に変換できますが、これはLINQが提供する拡張メソッドであり、リストの一部ではないため、ファイルの先頭yearList.ToArray()に追加することを忘れないでください。using System.Linq;クラス自体。

于 2012-10-25T22:36:38.423 に答える
0

カウンターを維持したい場合に使用できるのに、なぜForeachループを使用するのですか?For

        foreach (var int i = 0; i < years.Length; i++)
        {
            if (string.IsNullOrEmpty(years[i]))
                System.Diagnostics.Debug.WriteLine("empty");
            else
            {
                yearList.SetValue(years[i], i);
            }
        }
于 2012-10-25T22:38:07.893 に答える
0

私はあなたの目的が何であるかわかりません、そして私は経験がありませんが、ListItemあなたはこのアプローチを検討しましたか?

string[] yearList = years.Where(y => !string.IsNullOrEmpty(y)).ToArray();

これにより、nullまたは空ではないすべての年の配列が作成されます。また、これが役立つかどうかについて、リストをどのように使用しているかによっても異なります。配列である必要がない場合は、代わりにこれを行うこともできます。

var yearList = years.Where(y => !string.IsNullOrEmpty(y));

これらのソリューションは、診断出力またはの使用に関して、コードが実行することを正確に実行しないことに注意してくださいListItem。また、これがオプションであるかどうかについては、使用している.netのバージョンによっても異なります。

于 2012-10-25T22:57:08.727 に答える