无法使用for/if组合返回正确的int函数值

本文关键字:int 函数 返回 组合 for if | 更新日期: 2023-09-27 18:15:59

我有一个函数,它只需要返回List<Bitmap>中称为images的图片框中当前显示的图像的索引。它是一个名为displayImageIndex()int函数,我最初尝试这样运行它:

public int displayImageIndex()
{
    //index to return to function
    int displayIndex = 0;
    //access all images in list
    for (int i = 0; i < imagePaths.Count; ++i)
    {
        //matches image in picturebox
        if (picboxImage.ImageLocation == imagePaths[i])
        {
            //get index of image
            displayIndex = imagePaths.IndexOf(imagePaths[i]);
        }
    }
    return displayIndex;
}

这已编译,但总是返回displayIndex为0,尽管图像显然是在程序的其余部分工作时被找到的。然后我尝试这样做:

public int displayImageIndex()
{
    //value to return to function
    int displayIndex;
    //access all images in list
    for (int i = 0; i < imagePaths.Count; ++i)
    {
        //matches image in picturebox
        if (picboxImage.ImageLocation == imagePaths[i])
        {
            //get index of image
            displayIndex = imagePaths.IndexOf(imagePaths[i]);
            return displayIndex;
        }
    }
}

这给了我一个错误,告诉我'不是所有的代码路径返回值'。我试图通过在if语句中添加else来解决这个问题,但是这给了我一个警告,循环可能包含不可访问的代码。

基本上,无论我如何尝试运行它,我都会得到某种错误。我不知道该怎么做,因为函数绝对总是会找到一个值(picbox上的图像将始终是images列表中的一个),我只需要一个有效的方法,将始终返回此值,但我不知道如何将其放入函数。

任何帮助或点在正确的方向将是了不起的,提前谢谢你!

马克

无法使用for/if组合返回正确的int函数值

编译器不知道你的代码应该总是返回一些东西,并且"认为"if可能永远不会被击中,在这种情况下该方法将不返回任何东西。你可以解决这个问题,例如,如果没有发现抛出异常,像这样:

for(...)
{
    //...
}
throw new Exception("The item you searched for isn't on the list!");

我不太确定你为什么要用一个方法来获取你已经知道的东西的索引,我认为你可以替换这行

displayIndex = imagePaths.IndexOf(imagePaths[i]);

:

displayIndex = i;

然后,你的整个函数应该具有与IndexOf本身相同的功能,所以你的整个代码应该缩减为如下所示:

return imagePaths.IndexOf(picboxImage.ImageLocation);

我猜你的错误是picboxImage。ImageLocation实际上并不包含在列表中。可能是格式错误。您应该尝试设置一个断点,并通过将鼠标光标悬停在变量上来调查变量的内容。这是一个非常简单的方法来找出他们的确切内容

好吧,图像显然没有找到否则displayIndex会改变,所以你必须调试它,看看imagePaths是否真的包含picboxImage.ImageLocation

  • 在方法中设置一个断点
  • 按F11进入。
  • 观察窗口检查imagePaths,看看你的照片是否在那里。
  • 还要注意, string比较是区分大小写的所以你要么想使用imagePaths[i].ToLower == picboxImage.ImageLocation.ToLower()picboxImage.ImageLocation.Equals(imagePaths[i], StringComparison.InvariantCultureIgnoreCase);

同样,你应该使用

displayIndex = i;

代替:

displayIndex = imagePaths.IndexOf(imagePaths[i]);

你已经有索引了!

对于,不是所有的代码路径都返回值,您需要确保如果没有找到图像,则存在return语句事件。只需在方法的末尾添加默认的return值,如下所示:

public int displayImageIndex()
{
    //access all images in list
    for (int i = 0; i < imagePaths.Count; ++i)
    {
        //matches image in picturebox
        if (picboxImage.ImageLocation == imagePaths[i])
        {
            //get index of image
            return i;
        }
    }
    return -1;
}

或者简化为以下Linq语句:

public int displayImageIndex()
{
    return imagePaths.FindIndex(x => x.Equals(picboxImage.ImageLocation, StringComparison.InvariantCultureIgnoreCase));
}

您可以使用IndexOfToLower()以这种方式查找项目:

public int DisplayImageIndex()
{
    return imagePaths.Select(x => x.ToLower()).ToList()
                     .IndexOf(picboxImage.ImageLocation.ToLower());
}

如果imagepath不包含该路径,函数返回-1