这是我关于stackoverflow的第一篇文章,所以请原谅任何格式错误。
我有一个名为BOGOTotal的项目 - 基本上,它的工作是取一个十进制数组,按升序排序,然后确定将购买哪些价格以及哪些价格是免费的。无论如何,这只是一个背景故事,但我需要更具体的东西。
我有两个阵列 - 其中一个价格,以及其中一个价格。例如,在我的Items数组中(应该命名为“price”),Items [0]设置为2.20m,我的Quantities数组,Quantites [0]设置为5.意思是我有五个相同的项目价格为2.20美元。
//create items array
decimal[] Items = new decimal[5];
Items[0] = 2.20m;
Items[1] = 1.50m;
Items[2] = 8.40m;
Items[3] = 4.60m;
Items[4] = 3.75m;
//create quantity array
int[] Quantity = new int[Items.Length];
Quantity[0] = 5;
Quantity[1] = 2;
Quantity[2] = 1;
Quantity[3] = 3;
Quantity[4] = 6;
然后我必须按升序对Items数组进行排序。
Array.Sort(Items);
但是,当我对Items数组进行排序时,每个项目与其数量的关系现在都会丢失,因为Items [0]和Quantity [0]不再相关。现在,而不是Items [0] = 2.20m,它已成为Items [0] = 1.50m。现在,我有5件物品是$ 1.50而不是$ 2.20。
这是我的想法 - 我会继续通过创建firstPrices数组来计算旧数组的价格,将它们放在for循环中,然后说
decimal[] firstPrices = new decimal[Items.Length];
//calculate prices before sorting - will match back up afterward
for (int i = 0; i < Items.Length; i++)
{
firstPrices[i] = Items[i] * Convert.ToDecimal(Quantity[i]);
}
这是困难的部分:我正在尝试将每个数量重新对齐(缺少一个更好的单词)到其项目 - 这意味着我正在努力使2.20美元的项目与其正确的数量相匹配(5)。但是,我很难做到这一点。我在另一个for循环中尝试了一个嵌套的for循环,它通过将每个数量乘以当前项目然后将它与firstPrices中的那个位置进行比较来测试每个数量:
//i would be newItems
//j would be quantity
for (int i = 0; i < Items.Length; i++)
{
for (int j = 0; j < Items.Length; j++)
{
if (Items[i] * Quantity[j] == firstPrices[i])
{
Quantity[i] = Quantity[j];
break;
}
}
}
当找到匹配时,我将其设置为突破嵌套循环并递增“i”,这将转到Items数组中的下一个项目。我在这里做错了吗?
答案 0 :(得分:1)
你有两个相关的独立阵列,这不是一件好事。创建包含两个值的Struct,Class或Tupel。也可以选择自定义比较器。制作一个这种类型的数组。
然后就像调用Array.Sort()一样简单。
在没有单一订单的caess中(有时您希望按价格按数量排序。有时单项价格),Array.Sort()具有覆盖,允许您使用specify the comparer。
如果你有经验,你也可以去Linq。但要将两个值合并为一种类型是必需的。这是学习它的最佳时机。