0

ボタンをクリックするたびに、(作成したカテゴリのリストから) ランダムなカテゴリと適切な単語をメッセージ ボックスに表示するプログラムを作成したいと考えています。

実行するとカテゴリがランダム化されますが、カテゴリにあるはずの正しい単語が正しく配置されていません。 エラーのイメージ

また、プログラムがカテゴリの負のインデックスに達するか、すべてのカテゴリが表示されると、プログラムがクラッシュすることを知っています エラーの画像

しかし、負の値に達するとインデックスの削除が自動的に停止するように、どのロジックを使用すればよいかわかりません。

コード:

namespace randomCategory
{
public partial class Form1 : Form
{

    Random rand = new Random();
    List<string> categories = new List<string> { "Book Titles", "Movie Titles", "Car Parts", "Human Body Parts", "Transportations" };


    public Form1()
    {
        InitializeComponent();
        listBox1.DataSource = categories;
    }

    public void selection()
    {
        // logic for setting a random category
        int index = rand.Next(categories.Count);
        var category = categories[index];


        // logic for assigning the word for a category
        switch (index)
        {
            case 0:
                MessageBox.Show(category, "Harry Potter");
                break;
            case 1:
                MessageBox.Show(category, "Summer Wars");
                break;
            case 2:
                MessageBox.Show(category, "Bumper");
                break;
            case 3:
                MessageBox.Show(category, "Eyes");
                break;
            case 4:
                MessageBox.Show(category, "Boat");
                break;
            default:
                MessageBox.Show("Empty!", "!!!");
                break;
        }

        categories.RemoveAt(index);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        selection();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }
}
}
4

2 に答える 2

3

選択したランダムインデックスを反映するようにリストボックスの選択を設定する必要があります。

また、リストに項目がない場合は、これを行うべきではありません。したがって、このコードをメソッドに追加します。

if (categories.Count == 0)
    return;

問題は、リストからアイテムを削除すると、インデックス番号がステートメントcategoriesと一致しなくなることです。switchたとえば、次のようにcategories始まります。

{ "Book Titles", "Movie Titles", "Car Parts", "Human Body Parts", "Transportations" };

リストから任意の項目を選択すると、スイッチで一致します。たとえば、ランダムに 1 つを選択すると、プログラムは "Summer Wars" (映画のタイトル) を表示します。

しかし、その項目をリストから削除します。リストは次のようになります。

{ "Book Titles", "Car Parts", "Human Body Parts", "Transportations" };

リストからアイテムを削除したため、「Human Body Parts」である 2 をランダムに選択します。

この問題を回避する方法の 1 つは、 という別のリストを作成することunusedCategoriesです。次のように初期化します。

List<int> unusedCategories = new List<int> { 0, 1, 2, 3, 4 };

次に、そのリストから項目を選択します。

int selectedIndex = rand.Next(unusedCategories.Count);
int index = unusedCategories[selectedIndex];
// at this point, index is the index to one of the items in your `categories` list

switch (index)
{
    ....
}

unusedCategories.RemoveAt(selectedIndex);

そしてもちろん、ifステートメントを次のように変更します。

if (unusedCategories.Count == 0)
    return;
于 2013-03-29T17:04:33.610 に答える
0

string既存のリストをDictionary<T,T> 1行のコードに変換したい場合は、それを行うことができます

var categories = new List<string> 
{ 
  "Book Titles",
  "Movie Titles",
  "Car Parts",
  "Human Body Parts",
  "Transportations" 
 };
var catDict = categories.ToDictionary(c => c);
于 2013-03-29T18:41:08.807 に答える