Как получить наименьшие числа многомерного массива в C#?

#c#

Вопрос:

Это код до сих пор:

 public static class Vectors
{
    public static int[] FindShortest(int[][] vectors)
    {
        throw new NotImplementedException("Waiting to be implemented.");
    }

    public static void Main(string[] args)
    {
        int[][] vectors = 
        {
            new int[] { 1, 1, 1 },
            new int[] { 2, 2, 2 },
            new int[] { 3, 3, 3 }
        };

        int[] shortest = Vectors.FindShortest(vectors);
        // Expected output: x: 1, y: 1, z: 1
        Console.WriteLine(String.Format("x: {0}, y: {1}, z: {2}", shortest[0], shortest[1], shortest[2]));
    }
}
 

Код принимает массив 3D-векторов и возвращает самый короткий из них.

Комментарии:

1. Что shortest означает и почему ожидается результат 1,1,1 ? Хотите найти минимальный вектор, и в этом случае ожидаемый результат будет { 1, 1, 1 } ?

2. Итак, вы спрашиваете, как рассчитать длину вектора?

3. Вероятно, вам следует использовать Vector3 класс or Vector<T><T> вместо int[] и использовать Vector3.Min или Vector.in чтобы найти минимальный вектор

Ответ №1:

Вы должны начать с реализации метода векторной длины: длина вектора

 private static double VectorLength(int[] v) 
{
    return Math.Sqrt(v[0]*v[0] v[1]*v[1] v[2]*v[2]);
}
 

тогда это просто функция минимального значения:

 public static int[] FindShortest(int[][] vectors)
{
    var minLength = double.MaxValue;
    int[] minVec = Array.Empty<int>();
    foreach(var v in vectors) 
    {
        var vectorLength = VectorLength(v);
        if (vectorLength  < minLength) {
            minLength = vectorLength;
            minVec = v;
        }
    }
    return minVec;
}
 

имейте в виду, что вы не проверяете, имеют ли векторы длину 3 и т. Д.

кроме того, вы можете просто использовать Vector3, если вас устраивает точность с плавающей точкой

Комментарии:

1. Могу ли я предложить вам применить фон к вашей графике? В темном режиме это выглядит так , что очень трудно читать.

2. Мог бы также просто сделать var shortest = vectors.OrderBy(VectorLength).First();

3. да, OrderBy тоже работает, но примерно в 6 раз медленнее и потребляет больше памяти