C# 使用NAN从多维数组中找出最小值

C# 使用NAN从多维数组中找出最小值,c#,multidimensional-array,nan,min,C#,Multidimensional Array,Nan,Min,我有一个二维数组(double[,]),我想知道最小值是多少。我尝试了Linq.Select.Min,但由于我的数组通常包含NaN值,因此minvalue总是NaN 所以,我需要一些方法来找到“跳过”NaN的最小值 非常感谢您的帮助 试试这个: 更新: double[,] myarray = new double[4,4]; var rows = myarray.GetLength(0); var cols = myarray.GetLength(1); Enumerab

我有一个二维数组(
double[,]
),我想知道最小值是多少。我尝试了Linq.Select.Min,但由于我的数组通常包含
NaN
值,因此
minvalue
总是
NaN

所以,我需要一些方法来找到“跳过”NaN的最小值

非常感谢您的帮助

试试这个:

更新:

  double[,] myarray = new double[4,4];

  var rows = myarray.GetLength(0);
  var cols = myarray.GetLength(1);

  Enumerable.Range(0, rows * cols)
    .Where(i => !Double.IsNaN(myarray[i/rows, i%rows]))
    .Select(i => myarray[i/rows, i%rows])
    .Min();

毫无疑问,可以更广泛地使用.Range(),我现在将对此进行研究。

今天是扩展方法的日子!使用此选项可以在所有的
双[,]
上使用通用的
Min()
函数

这里有一些通用的[,]扩展。请注意,这仅适用于实现
i可比较的类型

这一条没有忽略任何东西:

public static T Min<T>(this T[,] arr) where T : IComparable
{
    bool minSet = false;
    T min = default(T);
    for (int i = 0; i < arr.GetLength(0); i++)
        for (int j = 0; j < arr.GetLength(1); j++)
            if (!minSet)
            {
                minSet = true;
                min = arr[i, j];
            }
            else if (arr[i, j].CompareTo(min) < 0)
                min = arr[i, j];
    return min;
}
公共静态双精度数字(双[,]数组)
{
返回array.Cast()
.Where(n=>!double.IsNaN(n))
.Min();
}

我编辑了这个问题。
范围(0,4)
不应该在那里(它是复制粘贴的),我不确定提供的代码在两个维度上都能工作。你能编辑你的答案来考虑一个通用的2D数组吗?我很乐意接受。您正在所有单元格中寻找两个维度的最小值?是的。假设阵列是地形的数字高程模型(在某种程度上是这样),网格中有一些无效值。我想找到地形的“最低”海拔高度(不管它的位置)。有趣的。。。你认为这种基准测试与更高级别的LINQ方法相比如何?它可能会稍微快一些,除非在LINQ库中有一些我不知道的幕后优化(在本例中我对此表示怀疑)。在LINQ版本中,您还创建了N个IEnumerables,其中N是数组第一维的长度。我很容易接受这一点,除非有人提出了一个非常聪明的LINQ表达式,它也可以工作…(顺便问一下,你认为这个扩展可以对任意维数的数组工作吗?)是的,我会在一分钟内重写它
public static T Min<T>(this T[,] arr) where T : IComparable
{
    bool minSet = false;
    T min = default(T);
    for (int i = 0; i < arr.GetLength(0); i++)
        for (int j = 0; j < arr.GetLength(1); j++)
            if (!minSet)
            {
                minSet = true;
                min = arr[i, j];
            }
            else if (arr[i, j].CompareTo(min) < 0)
                min = arr[i, j];
    return min;
}
public static T Min<T>(this T[,] arr, T ignore) where T : IComparable
{
    bool minSet = false;
    T min = default(T);            
    for (int i = 0; i < arr.GetLength(0); i++)
        for (int j = 0; j < arr.GetLength(1); j++)
            if (arr[i, j].CompareTo(ignore) != 0)
                if (!minSet)
                {
                    minSet = true;
                    min = arr[i, j];
                }
                else if (arr[i, j].CompareTo(min) < 0)
                    min = arr[i, j];
    return (minSet) ? min : ignore;
}
double[,] d = new double[5, 5]
{
    { 0, 1, 2, 3, 4 },
    { 5, 6, 7, 8, 9 },
    { 10, 11, -10, 12, 13 },
    { 14, 15, 16, 17, 18 },
    { 19, double.NaN, 21, 22, 23 }
};
Console.WriteLine(d.Min());
Console.WriteLine(d.Min(double.NaN));
public static double MinIsNumber(double[,] array)
{
    return array.Cast<double>()
        .Where(n => !double.IsNaN(n))
        .Min();
}