美好的一天
我需要使我的代码运行更快。我需要一次检查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开始。我正在寻找缩小尺寸的方法。
答案 0 :(得分:2)
我会做三件事:
bi_issuer
的构造函数中修剪bank_issuer
字段-每次都没有必要这样做。我不知道您是否需要这样做,但如果它不需要修剪,则根本不要这样做。var bankIssuers = bank_issuer_list.ToDictionary(bi => bi.bi_issuer);
)-在开始任何过程之前,请在循环之外进行此操作,并将该字典用于查找。-
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
}
});