Я бы сделал 3 вещи:
- Обрезать поле
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
}
});