Как использовать массив, чтобы выбрать диапазон чисел, а затем желаемый результат?

Например, если бы я хотел создать программу, которая дает человеку скидку в зависимости от того, сколько у него предметов. Если они будут покупать 0-5 предметов, они не получат скидку. Если они покупают 5-10 предметов, они получают скидку 5%, если они получают 10-20 предметов, они получают скидку 10% и так далее. Как я могу использовать массив, чтобы разобраться в этом вместо многих операторов "If"?

2 ответа

Решение

Вы можете поддерживать массив для представления диапазонов, которые вы дали. Я говорю о хранении как.... скажем, имя массива это массив, а затем массив [0]=5, т.е. максимальное значение первого интервала. затем массив [1]=10 макс. значений второго интервала и действуйте таким же образом. так как этот массив, который вы только что поддержали, будет содержать только небольшое количество значений, так что никаких проблем с производительностью при линейном поиске. Теперь, если numberOfOrderedItems меньше, чем value_of_array, вы можете разорвать цикл и решить, какую скидку вы хотите дать.

Если вы поддерживаете огромное количество дисконтных интервалов, тогда используйте линейный поиск вместо бинарного.

Как насчет того, чтобы начать со структуры для хранения границ и скидок:

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

Другие вопросы по тегам