2016-11-19 6 views
0

Итак, у меня есть настройка списка, в которой есть несколько имен библиотек внутри, когда вы запускаете программу, и когда она выбрана, поэтому я сделал это, чтобы получить содержимое выбранного элемента.C# .IndexOf Arraylist возвращает -1

Тогда я хотел узнать, где в arraylist я установил, что эта строка появляется, поэтому я использовал это.

Libraries tempLibrary = (Libraries)LibrariesAndBooks[index]; 

Как вы можете видеть на скриншоте ниже принято, когда программа достигла ошибки он находится в индексе [0] не -1, почему это происходит?

screenshot http://image.prntscr.com/image/4f8b31c2bc71419f9eff4cd98f34ef13.png

жестко прописывать Также будет 0 не вариант для того, что мне нужно делать, и если я сделал глупую ошибку или мой код делает вы хотите бросить то отлично, потому что я только в моем первый год университета, и по какой-либо причине он не делал никакого кода в 6-й форме, так что этого следовало ожидать.

+1

'selectedItem' - это строка, но ваш список содержит объекты класса. Использование 'IndexOf' не будет работать таким образом, поскольку оно не знает, к чему он должен сравнивать строку (он даже не знает, что он должен сравнивать строку с членом объекта), см. [Документация ] (https://msdn.microsoft.com/en-us/library/7w3e62a8 (v = vs.110) .aspx). – UnholySheep

ответ

0

Вы пытаетесь найти строку в коллекции объектов Libraries, которую IndexOf не может сделать. Вам нужно будет перебирать коллекцию и тестировать имя каждого элемента против selectedItem, чтобы найти индекс самостоятельно.

Возможно, вы даже подумаете о том, чтобы написать метод многократного использования, чтобы облегчить выполнение таких задач. Что-то вроде:

public static int FindIndex(IList collection, Func<object, bool> predicate) 
    { 
     for (int i = 0; i < collection.Count; i++) 
      if (predicate(collection[i])) 
       return i; 

     return -1; 
    } 

Таким образом, вы можете решить эту проблему легко идти вперед, как, например:

int index = FindIndex(LibrariesAndBooks, (item) => ((Libraries)item).Name == selectedItem) 

Чем проще, не многоразовые метод будет выглядеть следующим образом:

int index = -1; 
for (int i = 0; i < LibrariesAndBooks.Count; i++) 
{ 
    // Retrieve & soft cast - if it is a book, candidateLibrary will be null 
    Libaries candidateLibrary = LibrariesAndBooks[i] as Libraries; 
    if (candidateLibrary == null) 
     continue; 

    if (candidateLibrary.GetName() == selectedItem) 
    { 
     index = i; 
     break; 
    } 
} 

Удачи!

+0

Вы предполагаете, что 'lstLibrary.SelectedItem' представляет фактический объект? Согласно OP это список, который просто содержит копии членов 'name' объектов, хранящихся в' LibrariesAndBooks' – UnholySheep

+0

Моя ошибка. Будет корректироваться. – Daniel

+0

Не могли бы вы объяснить, что происходит в коде выше, поскольку мне нужно объяснить код, который я использовал, поэтому я не могу просто скопировать пасту и настроить ее работу. Извините, если я испытываю боль, я знаю, что могу найти каждый бит, чтобы узнать, что он делает, но я, вероятно, не знаю, что он делает в этом конкретном случае:/ – Aelux

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