我正在做一些运费计算。我需要一些帮助来解决这个问题。基本上,我有一个具有长度、宽度和高度属性的产品的通用列表。
我想轻松查看产品并找到所有三个属性的最大值。从这里,我可以做一些数学运算并根据产品数量计算出盒子的大小。
我最初的想法是制作 3 个数组并找到每个数组的最大值。只是想看看是否有一种我不知道的更简单或更酷的方式。
谢谢!
听起来像一个数组数组。当您从数据源(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
使用三个参数 、Length
和Width
命名的类Height
,并且您已经创建了一个包含此类实例的强类型集合:
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]
);
}
}
您真的很难找到三个数字的最小值、最大值和中间值吗?
将每列中的最小值当作只有两个
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]);
PS 我同意 anathonline 的观点,如果你想要一个最佳的盒子尺寸和如何包装物品,它比简单的数学要复杂得多。
您可能需要做的是拥有一组盒子尺寸,然后尝试将它们以最佳方式包装在一个或多个该尺寸的盒子中。
这是 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
现在您可以决定如何处理最后一个盒子中未使用的空间 - 要么将它们全部取出并尝试使用较小的盒子,要么尝试将所有物品打包在所有尺寸的盒子中,然后选择导致盒子数量最少的组合。