从ListBox字符串到Dictionary Key?

时间:2014-12-11 20:46:25

标签: vb.net dictionary listbox

我有一个Dictionary(Of Integer,String),它看起来像这样:

10, Bob
22, David

我有一个看起来像这样的ListBox:

Bob
David

我原以为这会是微不足道的,但是当用户在ListBox中选择David时,如何返回键22?

SelectedIndex在Dictionary上没用,除非我想循环计数。 SelectedItem似乎更有用,但我看到的所有示例都使用Linq,我宁愿避免使用它。所以现在我循环并寻找p.Value.Equals(listbox.SelectedItem),这是有效的,但我错过了一些明显的东西吗?

3 个答案:

答案 0 :(得分:0)

如果您不能使用字典的键来索引它,那么您必须遍历元素检查条件。因此,您正在循环并检查p.Value.Equals(listbox.SelectedItem)是否正确。 LINQ只是加快了这个循环搜索过程。

如果你真的想,你可以交换字典的密钥和索引,但这可能会在其他地方引起问题。

答案 1 :(得分:0)

您可以使用Dictionary作为BindingSource的数据,这将{"映射"数据到ListBox。这可以带来两个直接的好处:

  1. 数据的一个副本,期间
  2. ListBox SelectedValue 相关词典项目
  3. 实施起来非常简单:

    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的员工类,但希望IDValueMember

    使用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;
}