我有string articleId = "3.1.2.4.2015"
最后一个数字2015
代表文章的ID,它前面的数字代表文章的组和子组。例如,该文章位于组3
,子组1
,子子组2
和子子组4
中。
我有以下课程:
public class CustDiscount
{
public string CustomerId { get; set; }
public string Group{ get; set; }
public decimal Discount { get; set; }
public decimal Price { get; set; }
}
如果在CustDiscount
List<CustDiscount> listCustDisc;
我有以下对象,listCustDisc
个对象listCustDisc[0].Group = 3.1
listCustDisc[0].Discount = 5
listCustDisc[1].Group = 3
listCustDisc[1].Discount = 2
listCustDisc[2].Group = 1.2.4
listCustDisc[2].Discount = 8
的列表
listCustDisc
我必须得到Group
对象articleId
,该对象在开头最匹配listCustDisc[0]
。在上面的示例中,我必须得到13
。我怎么能这样做?
文章的子组数量最多为2015
。该方法不必考虑最后一个数字html,
body {
height: 100%;
}
#wrap {
height: 100%;
overflow-y: scroll;
}
。
答案 0 :(得分:0)
我必须获得与
listCustDisc
最匹配的Group
articleId
对象
因此,您有一篇ID为1.2.3.456
的文章和客户折扣列表,并且您正在尝试找到与给定文章相同的大多数子类别的文章。您可以首先通过计算子类别匹配的深度来确定折扣组与给定articleId的匹配程度。
修改:已更改MatchesAtDepth
,因此需要完整折扣组才能匹配。这意味着,1.2.345
的DiscountGroup不适用于ID为1.2.678
的商品。
public static int MatchesAtDepth(string discountGroup, string articleId) {
string[] dg = discountGroup.Split(new[] { '.' });
string[] aid = articleId.Split(new[] { '.' });
if (dg.Length > aid.Length) {
return -1;
}
for (int i = 0; i < dg.Length; i++) {
if (dg[i] != aid[i]) {
return -1;
}
}
return dg.Length;
}
然后,您可以对列表执行线性搜索,并跟踪与该类别最匹配的折扣:
public static CustDiscount FindMostSpecificDiscount(IEnumerable<CustDiscount> discounts, Article article) {
CustDiscount best = null;
int bestScore = 0;
foreach (CustDiscount discount in discounts) {
int score = MatchesAtDepth(discount.Group, article.Id);
if (score > bestScore) {
best = discount;
bescScore = score;
}
}
return best;
}
由于bestScore
已初始化为0
,因此折扣组必须具有此类别的某些部分。
但是如果你有两个折扣呢?一个用于组1.2
,折扣为20%,另一个用于组1.2.3
,折扣为15%。然后,ID为1.2.3.456
的文章将获得15%的回扣;根据折扣的结构,这可能是对还是错。
如果你有很多的CustDiscount
s,请考虑在你的子类别(例如prefix tree)上建立一个kpol/trie
来制作平均值查找与平均类别深度成比例,而不是折扣数量的一半。