2012-03-06 2 views
1

Я пытаюсь получить объект, находящийся в массиве, когда пользователь выбирает что-то в списке.Быстрый выбор объекта из списка

В настоящий момент список содержит список имен файлов и то, как я достиг решения, путем циклического прохождения массива и поиска подходящего имени файла и использования ссылки на объект после его обнаружения.

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

Есть ли более эффективный способ сделать это? Вместо того, чтобы полагаться на строку, соответствующую объекту?

+0

Является ли это WPF, WinForms или веб? –

ответ

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

Я не знаю, как вы заполняете свои коллекции, но вы можете использовать свойство Tag для ListBoxItem для хранения ссылки на изображение. После выбора просто введите значение тега в свой объект.

Смежные вопросы