1

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

4

2 回答 2

2

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

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

于 2013-04-04T08:08:33.960 回答
1

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

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

于 2013-04-04T08:09:17.693 回答