从 + 性能增强中检查 BIN 编号<list>



美好的一天

我需要让我的代码运行得更快。我需要一次检查 700 万条记录,执行以下检查需要 1 到 3 毫秒。我希望 somone 能给我关于如何更快地做到这一点的建议。

在下面的代码之前,我做了一个选择来预加载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 开始,作为每个系统设计。我正在考虑让它变小。

我会做3件事:

  1. bank_issuer的构造函数中修剪您的bi_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
}
});

最新更新