我的优惠配置了折扣价值和适用的音量范围。
它可能有多种适用于产品的优惠,因此我正在寻找算法来整合不同优惠中的重叠音量范围并显示适用的最终折扣。下面的代码片段有助于可视化问题:
class VolumeTierRange
{
public int Min { get; set; }
public int Max { get; set; }
public int Discount { get; set; }
}
/* Offer1Range */
List<VolumeTierRange> Offer1Ranges = new List<VolumeTierRange>{
new VolumeTierRange {Min=1, Max=20, Discount=2 },
new VolumeTierRange {Min=21, Max=49 , Discount=10 },
new VolumeTierRange {Min=50, Max=100 , Discount=5 },
new VolumeTierRange {Min=101, Max=1000, Discount=15}
};
/* Offer2Range */
List<VolumeTierRange> dicountBRanges = new List<VolumeTierRange>{
new VolumeTierRange {Min = 1, Max=50, Discount=6},
new VolumeTierRange {Min=51, Max=1000, Discount=10 }
};
合并后的结果如下:
List<VolumeTierRange> effectiveDiscount = new List<VolumeTierRange>{
new VolumeTierRange {Min=1, Max=20, Discount=8 },
new VolumeTierRange {Min=21, Max=49, Discount=16},
new VolumeTierRange {Min=50, Max=50, Discount=11},
new VolumeTierRange {Min=51, Max=100, Discount=15},
new VolumeTierRange {Min=101,Max=1000,Discount=25}
};
我确实有一些方法可以达到预期的结果,但那些似乎都不是很直观。
附加信息:第一项的最小值和所有商品的最大价值是固定的(在此示例中为1和1000)。在定义音量范围时也不会出现不连续性。
答案 0 :(得分:2)
嗯,您要做的第一件事就是找出Offer1Ranges
中dicountBRanges
与var query = from o in Offer1Ranges
from d in dicountBRanges
where o.Min <= d.Max
&& o.Max >= d.Min
select new VolumeTierRange()
{
Min = (o.Min > d.Min) ? o.Min : d.Min,
Max = (o.Max < d.Max) ? o.Max : d.Max,
Discount = o.Discount + d.Discount
};
中的值重叠的值。
当第一项的最小值小于(或等于*)第二项的最大值时,项重叠,而第二项的最小值小于(或等于*)第一项的最大值项目。有关详情,请参阅overlap代码info。
一旦您根据重叠项目加入了列表,它就足够简单地选择获取两个最小值中的最大值,两个最大值中的最小值以及折扣的总和每个项目的价值:
myfile.jar
You can see a live demo or rextester.
*在您的情况下,您认为项目重叠,即使它在一个点上(第一个的最小值等于第二个的最大值,反之亦然)。这不是一般情况。
请注意:此解决方案只有在两个列表以相同的数字开头和结尾时才有效,并且没有间隙,如问题中所述:
&#34; 附加信息:第一项的最小值和所有商品的最大值是固定的(在此示例中为1和1000)。在定义音量范围时也不会出现不连续性。&#34;