2012-03-06 66 views
1

我想要检索用户在列表框中选择某些内容时在数组中的对象。快速从列表框中选择一个对象

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

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

有没有更高效的方法来做到这一点?而不是依靠一个字符串来匹配对象?

+0

这是WPF,WinForms还是Web? – 2012-03-06 14:41:07

回答

1

如果您使用.NET Framework版本至少为3.5,那么你可以使用LINQ做到这一点:

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

执行速度应该是一样的,只是代码看起来有点清洁。

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

像这样的东西;

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

UpdateDisplay(); 
1

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

1

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