运输箱尺寸找到最大的侧面和最小的尺寸

时间:2012-09-07 17:57:48

标签: .net arrays shipping

我正在做一些运费计算。我需要一些帮助来解决这个问题。 基本上,我有一个具有长度,宽度和高度属性的通用产品列表。

我想轻松查看产品并找到所有三个属性的最大值。 从这里,我可以做一些数学计算,并根据产品数量计算出盒子大小。

我最初的想法是制作3个阵列并找到每个阵列的最大值。只是想看看我是否知道更简单或更冷的方式。

谢谢!

3 个答案:

答案 0 :(得分:1)

听起来像一个数组数组。当您从数据源(SQL Server,XML等)中读取每个元素(框)时,创建一个3个成员的数组并按大小顺序插入属性。然后,将三元数组添加到数组数组中。然后,您可以使用LINQ或其他函数对第一,第二或第三个成员对数组进行排序。

Box1,2,2,3
Box2,5,10,1
Box3,8,4,7

变为:

{  {10,5,1},  {8,7,4},  {3,2,2}  } // First

{  {8,7,4},  {10,5,1},  {3,2,2}  } // Second

{  {8,7,4},  {3,2,2},  {10,5,1}  } // Third

然后,您可以按第一个元素,第二个元素等对数组进行排序。

您可以使用LINQ在单个语句中轻松构建数组数组,但具体操作方式取决于数据源。假设您有一个名为Box的类,其中包含三个参数LengthWidthHeight,并且您创建了一个包含此类实例的强类型集合:< / p>

class BoxSorter {

    public IEnumerable<Box> Boxes {
        get;
        private set;
    }

    class Box {
        public double Height {
            get;
            set;
        }

        public double Width {
            get;
            set;
        }

        public double Length {
            get;
            set;
        }
    }

    public void Initialize() {

        this.Boxes = new List<Box>( new Box[] { 
            new Box() { Height = 2, Length = 2, Width = 3 },
            new Box() { Height = 5, Length = 10, Width = 1 },
            new Box() { Height = 8, Length = 4, Width = 7 }
        } );

    }

    public void Sort() {

        var l_arrayOfArrays =
            this.Boxes.Select(
            // Create an array of the Height, Length and Width, then sort the array elements (largest to smallest)
                b => new double[] { b.Height, b.Length, b.Width }.OrderByDescending( v => v ).ToArray()
            );

        var l_dimension1 =
            l_arrayOfArrays.OrderByDescending(
            // Sort the array of arrays by the first (and largest) dimension
                a => a[0]
            );

        var l_dimension2 =
            l_arrayOfArrays.OrderByDescending(
            // Sort the array of arrays by the second (and middle) dimension
                a => a[1]
            );

        var l_dimension3 =
            l_arrayOfArrays.OrderByDescending(
            // Sort the array of arrays by the third (and smallest) dimension
                a => a[2]
            );

    }

}

答案 1 :(得分:0)

您可能需要做的是拥有一组盒子尺寸,然后尝试将它们最佳地装在一个或多个那么大的盒子里。

This是2D情况的简单打包程序,您可以将其扩展为3D。

您的算法将有点像

    foreach box in boxes (ordered by decreasing volume)
        while there are unpacked items
            if box has space
                pack item
            else
                box = another box of the same size

现在您可以决定如何处理最后一个框中未使用的空间 - 要么全部挑选它们并尝试一个较小的框,要么尝试打包所有尺寸框中的所有项目,然后选择产生最少数量框的组合

答案 2 :(得分:0)

您在查找三个数字的最小值,最大值和中间值时遇到问题?

将每列中最小的一行视为只有两个字段是没有意义的 4 x 4 x 4
8 x 8 x 2
你会错误地得出结论,最小的是4 x 4 x 2,最大的是8 x 8 x 4.

        double[] dimensions;

        dimensions = new double[] {8,7,7};
        Array.Sort(dimensions);
        System.Diagnostics.Debug.WriteLine(dimensions[0]);
        System.Diagnostics.Debug.WriteLine(dimensions[1]);
        System.Diagnostics.Debug.WriteLine(dimensions[2]);

        dimensions = new double[] { 7, 9, 8 };
        Array.Sort(dimensions);
        System.Diagnostics.Debug.WriteLine(dimensions[0]);
        System.Diagnostics.Debug.WriteLine(dimensions[1]);
        System.Diagnostics.Debug.WriteLine(dimensions[2]);

P.S。我同意anathonline,如果你想要一个最佳的盒子大小以及如何包装这些物品,它比简单的数学更复杂。