快速从列表框中选择对象

时间:2012-03-06 14:30:27

标签: c#

当用户在列表框中选择某些内容时,我正在尝试检索数组中的对象。

目前,列表框中有一个文件名列表,我实现解决方案的方法是循环遍历数组并查找匹配的文件名,并在找到后使用对象引用。

foreach (CPSImage img in objWholeLibrary)
        {
            if (Path.GetFileName(img.FileName).Equals(lbxImageObjects.SelectedItem.ToString()))
            {
                currImage = img;
                break;
            }
        }
        UpdateDisplay();

有更有效的方法吗?而不是依靠字符串来匹配对象?

5 个答案:

答案 0 :(得分:1)

如何将项目加载到列表框中?您可能最好将数组对象加载到列表框中,然后重写ToString()方法以提供您在列表框中查找的字符串。

例如,如果我的列表框中填充了人,我可以这样做:

private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 0; i < 100; i++)
    { 
        Person p = new Person { FirstName = "John", LastName = "Doe", ID = Guid.NewGuid().ToString()};
        listBox1.Items.Add(p);
    }
}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    MessageBox.Show(((Person)listBox1.SelectedItem).ID);
}

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string ID { get; set; }
    public override string ToString()
    {
        return LastName + ", " + FirstName + " - " + ID;
    }
}

答案 1 :(得分:1)

像这样;

currImage = objWholeLibrary.Single(img => Path.GetFileName(img.FileName).Equals(lbxImageObjects.SelectedItem.ToString()));

UpdateDisplay();

答案 2 :(得分:1)

如果您使用.NET Framework版本至少3.5,那么您可以使用LINQ:

currImage = objWholeLibrary.FirstOrDefault(
    img => Path.GetFileName(img.FileName).Equals(
        lbxImageObjects.SelectedItem.ToString())
    );
UpdateDisplay();

执行速度应该相同,只是代码看起来会更清晰。

答案 3 :(得分:1)

如果列表框中填充了所有数组的项目,那么您只需要获取列表框的选定索引并获取数组中相同索引处的元素,它们应该匹配,因为列表和数组具有相同的数据和相同的索引。

答案 4 :(得分:1)

我不知道你如何填充你的集合,但你可以使用ListBoxItem的Tag属性来存储图像引用。选择刚刚将Tag值转换为对象。