根据计算切换数组中的元素(在嵌套的for循环中?)

时间:2017-04-03 18:16:47

标签: c# arrays sorting nested

这是我关于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数组中的下一个项目。我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

你有两个相关的独立阵列,这不是一件好事。创建包含两个值的Struct,Class或Tupel。也可以选择自定义比较器。制作一个这种类型的数组。

然后就像调用Array.Sort()一样简单。

在没有单一订单的caess中(有时您希望按价格按数量排序。有时单项价格),Array.Sort()具有覆盖,允许您使用specify the comparer

如果你有经验,你也可以去Linq。但要将两个值合并为一种类型是必需的。这是学习它的最佳时机。