【问题标题】:C# .IndexOf Arraylist returns -1C# .IndexOf Arraylist 返回 -1
【发布时间】:2017-04-03 13:51:02
【问题描述】:

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

     string selectedItem = lstLibraries.SelectedItem.ToString();

然后我想找出我设置的数组列表中的哪个位置出现了这个字符串,所以我使用了这个。

    Libraries tempLibrary = (Libraries)LibrariesAndBooks[index];

正如您在下面的屏幕截图中看到的那样,当程序遇到错误时,它位于 index[0] 而不是 -1,为什么会发生这种情况?

另外,将其硬编码为 0 不是我需要做的选择,如果我犯了一个愚蠢的错误或者我的代码让你想吐,那很好,因为我才刚上大学一年级,还没有'无论出于何种原因,都没有以第 6 种形式编写任何代码,因此这是意料之中的。

【问题讨论】:

  • selectedItemstring,但您的列表似乎包含一个类的对象。使用IndexOf 不会那样工作,因为它不知道应该将字符串与什么进行比较(它甚至不知道应该将字符串与对象的成员进行比较),请参阅@987654322 @.

标签: c# class arraylist


【解决方案1】:

您正试图在 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;
    }
}

祝你好运!

【讨论】:

  • 您假设lstLibrary.SelectedItem 代表实际对象?根据 OP,它是一个列表框,仅包含存储在 LibrariesAndBooks 中的对象的 name 成员的副本@
  • 我的错误。会调整的。
  • 您能否解释一下上面代码中发生的事情,因为我需要能够解释我使用的代码,所以我不能只是复制粘贴并调整以使其工作。抱歉,如果我很痛苦,我知道我可以查找每一点以了解它的作用,但我可能仍然不知道它在这种特殊情况下的作用:/
  • 当然。 FindIndex 最难掌握的部分是 Func 谓词,也是最重要的部分。这允许您接受一个函数作为参数,然后 FindIndex 可以调用该函数。在这种情况下,它返回 true(匹配)或 false(不匹配),我们在遍历集合时使用它来确定这是否是我们正在寻找的项目。如果是,我们返回当前索引位置。当您调用 FindIndex 时,您现在可以传入一个函数,该函数简单地确定某个项目是否是您要查找的项目。
  • 在这种情况下,这意味着确定对象的名称是否等于 selectedItem,因为 selectedItem 实际上只是一个对象名称。
猜你喜欢
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
相关资源
最近更新 更多