我有一个Dictionary(Of Integer,String),它看起来像这样:
10, Bob
22, David
我有一个看起来像这样的ListBox:
Bob
David
我原以为这会是微不足道的,但是当用户在ListBox中选择David时,如何返回键22?
SelectedIndex在Dictionary上没用,除非我想循环计数。 SelectedItem似乎更有用,但我看到的所有示例都使用Linq,我宁愿避免使用它。所以现在我循环并寻找p.Value.Equals(listbox.SelectedItem),这是有效的,但我错过了一些明显的东西吗?
答案 0 :(得分:0)
如果您不能使用字典的键来索引它,那么您必须遍历元素检查条件。因此,您正在循环并检查p.Value.Equals(listbox.SelectedItem)是否正确。 LINQ只是加快了这个循环搜索过程。
如果你真的想,你可以交换字典的密钥和索引,但这可能会在其他地方引起问题。
答案 1 :(得分:0)
您可以使用Dictionary
作为BindingSource
的数据,这将{"映射"数据到ListBox。这可以带来两个直接的好处:
SelectedValue
将 相关词典项目实施起来非常简单:
Private mCol As Dictionary(of Integer, String)
...
Dim bs As New BindingSource(mCol, Nothing)
myLB.DataSource = bs
myLB.DisplayMember = "Value"
myLB.ValueMember = "Key"
然后SelectedValue
将告诉您选择了哪个项目:
Private Sub myLB_SelectedValueChanged(sender As Object,
e As EventArgs) Handles myLB.SelectedValueChanged
Dim n As Integer = myLB.SelectedValue
Console.WriteLine("SelectedValue == {0} Related Data == {1}",
myLB.SelectedValue.ToString,
mCol(n))
End Sub
输出:
SelectedValue == 22 Related Data == David
您可以使用List(Of T)
执行相同操作但不必使用BindingSource
来执行此操作。存储的项目可能更复杂,例如显示Name
的员工类,但希望ID
为ValueMember
。
使用List
时,类的属性(或任何您想要显示的内容)将是ValueMember
;从Dictionary
开始,类必须Override ToString()
,并且返回的内容将显示。
答案 2 :(得分:0)
您可以使用LINQ:
public Int32 GetId()
{
var dic = new Dictionary<Int32, String>(); // Your dictionary
return dic.First(i => i.Value == (string) <YourListBox>.SelectedItem).Key;
}