从<列表>检查BIN编号+性能增强

时间:2018-09-05 07:22:02

标签: c# performance logic

美好的一天

我需要使我的代码运行更快。我需要一次检查700万条记录,并且需要1到3毫秒之间进行以下检查。我希望有人能给我一些建议,以加快速度。

在下面的代码之前,我要进行选择以预加载bank_issuer类(发生这种情况)并为文件(.txt)加载tmpCard。

 //golbal in class
 private List<bank_issuer> bank_issuer_list { get; set; }

          //code that I need help with

           for (int i = 10; i >= 1; i--)
            {
             string card_nr = tmpCard.card_number.Substring(0, i);

             foreach (bank_issuer item in bank_issuer_list)
              {
                if (card_nr.ToString() == item.bi_issuer.ToString().Trim())
                 {
                   issuer_found = true;
                   tmpcard.bp_id = item.bp_id;
                   break;
                 }
              }
              if (val_issuer_found)
               {
                  break;
               }                 
            }

class bank_issuer
{
    public string bi_issuer { get; set; }
    public string bp_id { get; set; }

    public bank_issuer(string bi_issuer, string bp_id)
    {
        this.bi_issuer = bi_issuer;
        this.bp_id = bp_id;
    }
    public bank_issuer()
    {
    }
}

注意: 根据系统设计,第一个for循环从10开始。我正在寻找缩小尺寸的方法。

1 个答案:

答案 0 :(得分:2)

我会做三件事:

  1. bi_issuer的构造函数中修剪bank_issuer字段-每次都没有必要这样做。我不知道您是否需要这样做,但如果它不需要修剪,则根本不要这样做。
  2. 从银行发行人列表中创建字典以利用密钥散列(var bankIssuers = bank_issuer_list.ToDictionary(bi => bi.bi_issuer);)-在开始任何过程之前,请在循环之外进行此操作,并将该字典用于查找。
  3. 更改方法以使用字典:

-

for (int i = 10; i >= 1; i--)
{
    string card_nr = tmpCard.card_number.Substring(0, i);
    if (bankIssuers.TryGetValue(card_nr, out var issuer))
    {
        issuer_found = true;
        tmpcard.bp_id = issuer.bp_id;
        break;   
    }
}

现在,我不了解所有这些代码或它所运行的环境等,但是您也可能会使用并行性(但不要盲目使用它,因为如果如果您使用的不是线程安全的非自包含代码,则代码不是自包含的。

想象上面的代码在方法bool TryPopulateIssuer(card tmpcard)中,并且来自卡片列表:List<card> cards,您可以编写如下代码:

Parallel.ForEach(cards, card => {
    if (!TryPopulateIssuer(card))
    {
        // do something on failure to find the issuer
    }
});