我在c#中有一个Winform,我正在尝试使用我拥有的按钮列表构建一个哈希表。 IE:Monday0700Button,Monday0730Button,Monday0800Button,依此类推。 在哈希表中我试图对它们进行排序,这样如果我需要使用一个按钮,以及它后面的按钮,我可以使用哈希表键。 IE:如果我需要为0730周一和0800周一的背景上色,我可以告诉它找到列表中的下一个键。
如何将这些按钮添加到哈希表中,以便我可以在此容量中使用它们。 感谢。
答案 0 :(得分:3)
您需要的可能是OrderedDictionary,但其他方法也是可行的。我不会选择Hashtable,因为这是无序的,需要更多的编码来获取订购信息。
使用以下内容填充OrderedDictionary
(我假设WinForms按钮,但ASP.NET或其他按钮也可以使用):
// I assume your buttons are created somewhere
// or already exist, i.e., they look something like:
Button MondayXXXButton = new Button();
MondayXXXButton.Name = "MondayXXXButton";
MondayXXXButton.Text = "Hello world";
OrderedDictionary buttons = new OrderedDictionary();
buttons.Add(MondayXXXButton.Name, MondayXXXButton);
// etc: for each button
注意:您可以通过循环浏览所有控件来自动添加按钮。
然后,您可以使用以下方法查找下一个订购商品的位置(遗憾的是,您无法在没有循环的情况下获得“下一个商品”,如果需要,您必须编写自己的有序列表):
Button GetNextButton(OrderedDictionary buttons, string searchThis)
{
IEnumerator enumerator = buttons.Keys.GetEnumerator();
for (enumerator.Reset(); enumerator.MoveNext(); )
if (enumerator.Current == searchThis)
break;
// if false, nothing was found, or last item was found
if (enumerator.MoveNext())
return (Button)enumerator.Current;
else
return null;
}
最后,使用它来获取某个按钮并检索下一个按钮:
Button someButton = (Button) buttons["MondayYYYButton"];
Button nextButton = GetNextButton(buttons, "MondayYYYButton");
使用OrderedDictionary的好处是您不必担心如何添加项目,它们将为您订购。
更新: 略有扩展的解释
答案 1 :(得分:0)
哈希表没有固有的顺序。标准哈希表中没有“下一个”键。
您实际上使用了您可能应该使用的数据结构的名称:List。列表将使您能够根据需要“前进”和“后退”。
答案 2 :(得分:0)
如果没有更多信息,这很难回答,但是,根据您的具体情况,首先想到的是这一点。如果您将按钮的ID设置为Monday0700Button或Monday0730Button,请将这些字符串添加到列表中。
List<string> myButtons = new List<string>();
myButtons.Add( "Monday0700Button" );
myButtons.Add( "Monday0730Button" );
myButtons.Add( "Monday0800Button" );
myButtons.Add( "Monday0830Button" );
然后当你需要使用一个时,使用'FindControl'来查找按钮的实例。
int index = myButtons.IndexOf( clickedButtonId );
FindControl( myButtons[index++] );
您不希望将按钮的实例放入Hashtable /字典中,我不这么认为。
答案 3 :(得分:0)
双向链表对于前向和后向迭代都是更合适的数据结构,其中每个列表项用作按钮的数据源(例如,左侧按钮将遍历左侧节点,右侧按钮)按钮将遍历到右侧节点)。在讨论的这一点上将按钮存储在数据结构中并没有多大意义,而是存储描述每个节点的信息,以便静态按钮可以正确更新其文本。
您也可以使用List实现此目的,但是,在表示层中需要更多代码。