从列表框中快速选择对象

本文关键字:快速选择 对象 列表 | 更新日期: 2023-09-27 18:26:47

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

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

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

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

从列表框中快速选择对象

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

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

执行速度应该相同,只是代码看起来会更干净一些。

类似的内容;

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

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

我不知道如何填充集合,但您可以使用ListBoxItem的Tag属性来存储图像引用。选择后,只将标记值投射到对象。

如何将项目加载到列表框中?您最好将数组对象加载到列表框中,然后重写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;
    }
}