无法将类型 double 隐式转换为 int

Cannot implicitly convert type double to int

所以我有一堆数组,我正在尝试使用 ArrayA 的索引从 arrayB 中检索元素。例如。如果我有名称 cucumber 并且它在 arrayB 中,我试图从另一个数组中获取 cucumber 的索引。

如下面的代码所示,我的代码的最后一行不起作用,它告诉我无法将 double 转换为 int。

编辑:我将我的代码更改为 int index,现在我的 fmin(something1, something2) 给我同样的错误...

    private double fmin(double[] a, int b)
    {
        double Min = a[0];
        for (int i = 0; i < b; i++)
        {
            if (Min > a[i])
                Min = a[i];
        }
        Min = Array.IndexOf(a, min);
        return Min;
    }

    int index = fmin(something1, something2);
    output = (something3[index]);

最简单的解决方法是从您的函数中 return 一个 int

private int fmin(double[] a, int b)
{
    double Min = a[0];
    for (int i = 0; i < b; i++)
    {
        if (Min > a[i])
            Min = a[i];
    }

    return Array.IndexOf(a, Min);
}

int index = fmin(something1, something2);
output = (something3[index]);

解决相同问题的另一种方法是在遍历数组时跟踪最小值的索引。

fmin returns Min,double类型。然后设置索引,它是 fmin(double) 的 return 值的 int 类型。使变量类型一致

首先,作为一种良好的做法,我建议您习惯于在每个算法开始时进行一些错误案例检查,以保证全面覆盖您的输入。

其次,正如 Eric Lippert 所说,您必须为变量分配有意义的名称,并避免在它们的目的不正确时重复使用它们相同,除非您过度优化了某些算法,该算法经常 运行 在具有大量迭代的循环中。

您还可以利用输出变量的强大功能:它们必须在函数 returns 之前设置。在异常情况下,函数没有义务为输出变量设置任何值。所以你会有一个很好的函数,它 returns minIndexminValue 来自 arrayA.

如果您需要一个从不抛出异常的 'stable' 函数,我已经编写了另一个实现“bool TryDoSomenthing(out result)”模式的版本。此函数 returns 'true' 仅在索引计算成功的情况下使用。我在多个连续故障的情况下由于性能命中问题而导致异常不理想的系统上广泛使用此模式。

代码:

// Finds the index of the lowest value in the array, considering just the 'n' first numbers.
// Throws exceptions in case of bad input parameters.
private static void GetMin(double[] a, int n, out int minIndex, out double minValue)
{
    if (a == null)
        throw new ArgumentNullException(nameof(a));
    if (a.Length <= 0)
        throw new ArgumentException("array 'a' contains no elements");
    if (n <= 0)
        return new ArgumentException("'n' must be greater than 0");

    minIndex = 0;
    minValue = a[0];
    if (n > a.Length)
        n = a.Length;
    for (i = 1; i < n; ++i)
        if (minValue > a[i])
            minValue = a[(minIndex = i)];
}

// Finds the index of the lowest value in the array, considering just the 'n' first numbers.
// Returns 'false' in case of bad input parameters.
private static bool TryGetMin(double[] a, int n, out int minIndex, out double minValue)
{
    if (a == null || a.Length <= 0 || n <= 0)
    {
        minIndex = -1;
        minValue = double.MinValue;
        return false;
    }

    minIndex = 0;
    minValue = a[0];
    if (n > a.Length)
        n = a.Length;
    for (i = 1; i < n; ++i)
        if (minValue > a[i])
            minValue = a[(minIndex = i)];
    return true;
}


internal static void Main()
{
    double[] arrayA = new double[] { 3.0, 2.0, 4.0, 1.0 };
    object[] arrayB = new object[] { 'x', 'y', 'z', 'w' };

    int minIndex; // index of minimum value found in 'arrayA'
    double minValue; // minimum value found in 'arrayA'
    object b; // used for storing the element of arrayB at 'minIndex'

    // With GetMin() - this code will throw an exception on bad inputs:
    GetMin(arrayA, 3, out minIndex, out minValue);
    b = arrayB[minIndex];

    // Or with TryGetMin:
    if(TryGetMin(arrayA, 3, out minIndex, out minValue))
    {
        b = arrayB[minIndex];
    }
    else
    {
        // TryGetMin() was not successful, do something about it.
        b = null;
    }

    // Or simply:
    b = TryGetMin(arrayA, 3, out minIndex, out minValue) ? arrayB[minIndex] : null;

    //...
}