C# 三维阵列切片中的最小值和最大值

C# 三维阵列切片中的最小值和最大值,c#,max,min,multidimensional-array,C#,Max,Min,Multidimensional Array,我有一个3d数组double[,]number=新的double[x,y,z]

我有一个3d数组
double[,]number=新的double[x,y,z]
当然,通过简单的循环很容易做到,但是C#是否有任何函数可以找到切片中的最小值和最大值

为了进一步解释,也许这段“不真实”的代码会有所帮助:

int i;

double[] xmin = new double[x];
double[] xmax = new double[x];
double[] ymin = new double[y];
double[] ymax = new double[y];
double[] zmin = new double[z];
double[] zmax = new double[z];

for(i = 0; i < x; i++)
{
    MinOf(numbers[i, y, z]) = xmin[i];
    MaxOf(numbers[i, y, z]) = xmax[i];
}

for(i = 0; i < y; i++)
{
    MinOf(numbers[x, i, z]) = ymin[i];
    MaxOf(numbers[x, i, z]) = ymax[i];
}

for(i = 0; i < z; i++)
{
    MinOf(numbers[x, y, i]) = zmin[i];
    MaxOf(numbers[x, y, i]) = zmax[i];
}
inti;
double[]xmin=新的double[x];
double[]xmax=新的double[x];
double[]ymin=新的双精度[y];
double[]ymax=新的双精度[y];
double[]zmin=新的double[z];
double[]zmax=新的double[z];
对于(i=0;i
希望有人能帮我。
干杯,Phil13131

你在找这样的东西吗

double[, ,] numbers = new double[2, 2, 2];

numbers[0, 0, 0] = 0;
numbers[0, 0, 1] = 1;
numbers[0, 1, 0] = 2;
numbers[0, 1, 1] = 3;
numbers[1, 0, 0] = 4;
numbers[1, 0, 1] = 5;
numbers[1, 1, 0] = 6;
numbers[1, 1, 1] = 7;

double[] xmax = new double[numbers.GetLength(0)];
double[] ymax = new double[numbers.GetLength(1)];
double[] zmax = new double[numbers.GetLength(2)];

for (int x = 0; x < xmax.Length; x++) xmax[x] = int.MinValue;
for (int y = 0; y < ymax.Length; y++) ymax[y] = int.MinValue;
for (int z = 0; z < zmax.Length; z++) zmax[z] = int.MinValue;

for (int x = 0; x < xmax.Length; x++)
    for (int y = 0; y < ymax.Length; y++)
        for (int z = 0; z < zmax.Length; z++)
        {
            xmax[x] = Math.Max(xmax[x], numbers[x, y, z]);
            ymax[y] = Math.Max(ymax[y], numbers[x, y, z]);
            zmax[z] = Math.Max(zmax[z], numbers[x, y, z]);
        }

// xmax == { 3, 7 }
// ymax == { 5, 7 }
// zmax == { 6, 7 }
double[,]数字=新的double[2,2,2];
数字[0,0,0]=0;
数字[0,0,1]=1;
数字[0,1,0]=2;
数字[0,1,1]=3;
数字[1,0,0]=4;
数字[1,0,1]=5;
数字[1,1,0]=6;
数字[1,1,1]=7;
double[]xmax=新的double[numbers.GetLength(0)];
double[]ymax=新的double[number.GetLength(1)];
double[]zmax=新的double[numbers.GetLength(2)];
对于(intx=0;x
你在找这样的东西吗

double[, ,] numbers = new double[2, 2, 2];

numbers[0, 0, 0] = 0;
numbers[0, 0, 1] = 1;
numbers[0, 1, 0] = 2;
numbers[0, 1, 1] = 3;
numbers[1, 0, 0] = 4;
numbers[1, 0, 1] = 5;
numbers[1, 1, 0] = 6;
numbers[1, 1, 1] = 7;

double[] xmax = new double[numbers.GetLength(0)];
double[] ymax = new double[numbers.GetLength(1)];
double[] zmax = new double[numbers.GetLength(2)];

for (int x = 0; x < xmax.Length; x++) xmax[x] = int.MinValue;
for (int y = 0; y < ymax.Length; y++) ymax[y] = int.MinValue;
for (int z = 0; z < zmax.Length; z++) zmax[z] = int.MinValue;

for (int x = 0; x < xmax.Length; x++)
    for (int y = 0; y < ymax.Length; y++)
        for (int z = 0; z < zmax.Length; z++)
        {
            xmax[x] = Math.Max(xmax[x], numbers[x, y, z]);
            ymax[y] = Math.Max(ymax[y], numbers[x, y, z]);
            zmax[z] = Math.Max(zmax[z], numbers[x, y, z]);
        }

// xmax == { 3, 7 }
// ymax == { 5, 7 }
// zmax == { 6, 7 }
double[,]数字=新的double[2,2,2];
数字[0,0,0]=0;
数字[0,0,1]=1;
数字[0,1,0]=2;
数字[0,1,1]=3;
数字[1,0,0]=4;
数字[1,0,1]=5;
数字[1,1,0]=6;
数字[1,1,1]=7;
double[]xmax=新的double[numbers.GetLength(0)];
double[]ymax=新的double[number.GetLength(1)];
double[]zmax=新的double[numbers.GetLength(2)];
对于(intx=0;x
您可以创建枚举切片的方法。这是一个维度,您需要另外两个维度,但我认为您可以做到:

public static IEnumerable<T> SliceX<T>(T[,,] data, int x) {
  for (int y = 0; y < data.GetLength(1); y++) {
    for (int z = 0; z < data.GetLength(2); z++) {
      yield return data[x, y, z];
    }
  }
}
您可以创建一个扩展方法,在一次迭代中同时获取最小值和最大值:

public static class IEnumerableExtensions {

  public static void GetMinMax<T>(this IEnumerable<T> data, out T min, out T max) where T : IComparable<T> {
    bool first = true;
    min = max = default(T);
    foreach (T value in data) {
      if (first) {
        min = max = value;
        first = false;
      } else {
        if (value.CompareTo(min) < 0) min = value;
        if (value.CompareTo(max) > 0) max = value;
      }
    }
  }

}

您可以创建枚举切片的方法。这是一个维度,您需要另外两个维度,但我认为您可以做到:

public static IEnumerable<T> SliceX<T>(T[,,] data, int x) {
  for (int y = 0; y < data.GetLength(1); y++) {
    for (int z = 0; z < data.GetLength(2); z++) {
      yield return data[x, y, z];
    }
  }
}
您可以创建一个扩展方法,在一次迭代中同时获取最小值和最大值:

public static class IEnumerableExtensions {

  public static void GetMinMax<T>(this IEnumerable<T> data, out T min, out T max) where T : IComparable<T> {
    bool first = true;
    min = max = default(T);
    foreach (T value in data) {
      if (first) {
        min = max = value;
        first = false;
      } else {
        if (value.CompareTo(min) < 0) min = value;
        if (value.CompareTo(max) > 0) max = value;
      }
    }
  }

}


OT:只需在每个循环中声明
i
。C#根本不支持“切片”。所以你必须在这里循环。OT:只需在每个循环中声明
i
。C#根本不支持“切片”。所以你必须在这里循环。它看起来和我需要的东西一模一样,非常感谢!我不知道枚举类,但我会读到它。输出正是我所期望的。你能解释一下输入的
x:i
等是什么意思吗?我从来没有见过。你的代码突然完全改变了,你的旧方法消失了,你把它替换了。我看到你只是简单地循环了一下,你的旧答案怎么了?基于枚举的解决方案很好,但这更简单、更有效。注意:最大数组初始化为零,所以这只适用于正数。我认为你的方法不总是有效的。我必须在每个片上循环并保存第一个值,因为我不能期望0小于最大值(例如,如果数字都是负数)。编辑:正如你刚才所说的……它看起来和我需要的东西一模一样,非常感谢!我不知道枚举类,但我会读到它。输出正是我所期望的。你能解释一下输入的
x:i
等是什么意思吗?我从来没有见过。你的代码突然完全改变了,你的旧方法消失了,你把它替换了。我看到你只是简单地循环了一下,你的旧答案怎么了?基于枚举的解决方案很好,但这更简单、更有效。注意:最大数组初始化为零,所以这只适用于正数。我认为你的方法不总是有效的。我必须在每个片上循环并保存第一个值,因为我不能期望0小于最大值(例如,如果数字都是负数)。编辑:正如你刚才说的……谢谢,我已经做了类似的事情,但我想知道C#是否已经有了类似的方法。毕竟,它们可能会更有效,而且通过这种方法也会减少我的代码。@phil13131:不,没有内置的用于切片数组的方法。好的,谢谢你,我只是尝试了你的方法和上面的方法,并接受了另一种方法,因为它更快。但我学到了一些关于IEnumerable的知识,感谢你=)我现在接受了你的答案,因为另一个答案并不总是有效(如果数字是负数)。谢谢你,我已经做了类似的事情,但我想知道C是否已经有了类似的方法。过了一会儿