查找具有最佳匹配子类别的对象

时间:2018-04-16 08:45:56

标签: c#

我有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; }

1 个答案:

答案 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来制作平均值查找与平均类别深度成比例,而不是折扣数量的一半。