【问题标题】:How to use an array to select a range of numbers and then the desired output?如何使用数组选择一系列数字,然后选择所需的输出?
【发布时间】:2013-04-04 07:55:43
【问题描述】:

例如,如果我想创建一个程序,根据某人拥有的物品数量为他们提供折扣。如果他们要购买 0-5 件商品,他们不会获得折扣。如果他们购买 5-10 件商品,他们将获得 5% 的折扣,如果他们购买 10-20 件商品,他们将获得 10% 的折扣,依此类推。如何使用数组而不是许多“If”语句来排序?

【问题讨论】:

  • 你有没有尝试过……或者外包……
  • 还有 20-30 件商品,你希望给什么折扣?

标签: c# arrays numeric-ranges


【解决方案1】:

如何从存储边界和折扣的结构开始:

public struct DiscountSpec
{
   public int MinItems{get;set;}
   public int MaxItems{get;set;}
   public double Discount{get;set;}
}

把它放在一个数组中

DiscountSpec[] discounts = new DiscountSpec[]
{
   new DiscountSpec(){MinItems=0,MaxItems=5,Discount=0},
   new DiscountSpec(){MinItems=5,MaxItems=10,Discount=0.05},
   new DiscountSpec(){MinItems=10,MaxItems=20,Discount=0.10},
}

然后是魔法

int numItemsPurchased=7;
var discount = discounts.Where(
      d => d.MinItems<numItemsPurchased && d.MaxItems>=numItemsPurchased)
                        .Select(d => d.Discount)
                        .FirstOrDefault();

现在,discount 将包含0(无折扣)或0.05(5% 折扣)或0.1(10% 折扣)。如果需要,可以使用其他折扣范围进行扩展。

现场示例:http://rextester.com/YDOWS85239

【讨论】:

  • 小点:您发布的代码会将 5 件商品放入“无折扣”插槽,而 OP 希望将其放入“5% 折扣”插槽。也许您应该将范围从半开区间更改为封闭(即包含)区间。
  • @MatthewWatson - 好地方,但 5 进入 0-5 还是 5-10 时 OP 不清楚。
【解决方案2】:

您可以维护一个数组来表示您给定的范围。我说的是存储之类的...... 说数组名称是数组然后数组[0] = 5,即第一个间隔的最大值。然后 array[1]=10 第二个间隔的最大值并以相同的方式进行。因为你刚刚维护的这个数组只包含少量的值,所以线性搜索没有性能问题。 现在,如果 numberOfOrderedItems 小于 value_of_array 你可以打破循环并决定你想要给予的折扣。

如果您要维护大量折扣区间,请使用二分搜索而不是线性搜索。

【讨论】:

  • 这是一个通用算法...我没有用过C#所以我无法用C#解释
猜你喜欢
  • 2015-05-14
  • 2017-05-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2021-03-16
  • 2016-04-15
相关资源
最近更新 更多