我正在使用列表。我已经能够确定列表中项目的第一个和最后一个位置。我正在使用getPostion
并通过Label
显示项目名称。我的表单中有三个按钮:ShowFirstItem
ShowNextItem
(不工作)和ShowLastItem
在标签中显示相应的项目。我的下一个项目有问题。我没有持有当前fruit_tree
的成员。因此,我不确定如何添加int
成员或名为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();
}
}
}
答案 0 :(得分: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
{
...
}
答案 1 :(得分: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,不增加当前值。