C#.IndexOf Arraylist返回-1

时间:2016-11-19 22:31:28

标签: c# class arraylist

所以我有一个列表框设置,当你启动程序时,里面有几个库名称,当选择一个时,我这样做是为了获取所选项目的内容。

     string selectedItem = lstLibraries.SelectedItem.ToString();

然后我想知道我在arraylist中设置了这个字符串的位置,所以我使用了它。

    Libraries tempLibrary = (Libraries)LibrariesAndBooks[index];

正如您在程序达到错误时所见的截图中所见,它位于索引[0]而不是-1为什么会发生这种情况?

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

同样硬编码为0并不是我需要做的选择,如果我犯了一个愚蠢的错误或者我的代码让你想要那么好,因为我只是在大学的第一年并且没有无论出于何种原因,我都会以第6种形式完成任何代码,因此可以预期。

1 个答案:

答案 0 :(得分: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;
    }
}
祝你好运!