2

私はリストを扱っています。リスト内のアイテムの最初と最後の位置を特定できました。を使用getPostionしてアイテム名を表示していLabelます。私のフォームの3つのボタン:(機能してShowFirstItem ShowNextItemいません)ShowLastItemラベルに対応するアイテムを表示します。次のアイテムに問題があります。現在の を保持しているメンバーはいませんfruit_treeintしたがって、メンバーまたは という別のfruit_treeメンバーを追加する方法がわかりませんcurrent。次(最初の後の項目)を見つけて結果を表示するにはどうすればよいですか?

 public class ListForTrees
 {

        public fruit_trees GetNextTree()
            {
                current = 0;
                fruit_trees ft = first_tree;
                int i = 0;
                while (i != current)
                {
                    ft = ft.next_tree;
                    i++;

                }

                return ft;
            }

            }

            ListForTrees mainlist = new ListForTrees();     

            private void BtnGo_Click(object sender, EventArgs e)
            {
                fruit_trees[] ar_items = {   new fruit_trees("cherry", 48, 12.95, 3),
                                                 new fruit_trees("pine", 36, 9.95, 8),
                                                 new fruit_trees("oak", 60, 14.95, 2),
                                                 new fruit_trees("peach", 54, 19.95, 3),
                                                 new fruit_trees("pear", 36, 11.85, 2),
                                                 new fruit_trees("apple", 62, 13.45, 5)
                                             };   
                mainlist = new ListForTrees(ar_items);
                fruit_trees current = mainlist.first_tree;   

                while (current != null)
                {
                    TxtOutput.AppendText(current.ToString() + Environment.NewLine);
                    current = current.next_tree;
                }
            }


            private void ShowFirstItem_Click_1(object sender, EventArgs e)
            {
            // Show First Item
        labelSpecificTree.Text = mainlist.first_tree.GetTreeType;

            } 

            private void ShowLastItem_Click(object sender, EventArgs e)
            {
            //Show Last Item
        labelSpecificTree.Text = mainlist.last_tree.GetTreeType;
            }

        private void ShowNextItem_Click(object sender, EventArgs e)
            {
            //Show Next Item
 fruit_trees obj = mainlist.GetNextTree();

            if (obj == null)
            {
                labelSpecificTree.Text = "No more trees!";
            }
            else
            {
                mainlist.current++;
                labelSpecificTree.Text = obj.next_tree.GetTreeType.ToString();                
            }   
            }



        }
4

2 に答える 2

2

これで問題が解決するかどうかはわかりませんが、追加できます

public fruit_trees current_tree;

ListForTreesクラスのフィールド。

次に、次を表示し、リスト内の次の項目に項目ポインターを移動するメソッドを簡単に追加できます。現在のアイテムを覚えておくと、リストから次のツリーが必要になるたびにリスト全体を参照する必要がなくなります。コードは次のようになります。

public fruit_trees GetNextTree()
{
    //save currently pointed tree
    fruit_trees tree = this.current_tree;
    if (tree != null)
    {
        //move current_tree to the next tree, to be returned next time
        current_tree = current_tree.next_tree;
        //return saved tree object
    }
    return tree;
}

current_tree機能させるには、リストに追加された最初のツリーでの値を開始することも忘れないでください。ResetNextTreePointer()リストの最初のツリーを指す何らかのメソッドを書くこともできます。

コードに対するその他の提案:

  • クラスのフィールドにプロパティを使用する方が良いと思います。つまり、変更します

    public fruit_trees first_tree;
    

    の中へ

    private fruit_trees first_tree;
    public fruit_trees First_tree { get { return first_tree; }
    

    クラス外のクラスがそれらのフィールドを明示的に変更することを無効にするためです。

  • このコード:

    if (count == 0)
    {
        ...
    }
    else if (count != 0)
    {
        ...
    }
    

    次のように変更できます。

    if (count == 0)
    {
        ...
    }
    else
    {
        ...
    }
    
于 2012-12-13T21:23:05.420 に答える
1

追加します

public int current; 

木のリストへ。コンストラクターで 0 に設定します。

次に、現在の fruit_trees オブジェクトを返すメソッドを作成します

public fruit_trees getCurrent()
{
    fruit_trees ft = first_tree;
    int i = 0;   
    while(i != current)
    {
       ft = ft.next_tree;
       i++;
    }
    return ft;
 }

現在、このメソッドは次のオブジェクトではなく現在のオブジェクトを返します。したがって、次のボタン イベントには 2 つのオプションがあります。
ここでの質問は、ボタンがクリックされるたびに次のツリー オブジェクトに移動しますか? その場合は、現在のプロパティをインクリメントし、getcurrent を呼び出して表示します。現在の値を保持して移動しないようにする場合 (つまり、[次へ] を何度もクリックしても同じ結果になる)、現在の値をインクリメントせずに getcurrent().next_tree.tree_type を表示します。

于 2012-12-13T21:22:06.577 に答える