

C# .NET jak snížit časovou náročnost
Ahoj,
mám kód, který "zamrzne" program, tedy asi se jedná o přílišnou časovou náročnost.
Jde o porovnávání docela rozsáhlých kolekcí.
var NedostupneVyrobky = HlidaneVyrobkyList.Where(b => !vyrobkyVXML.Any(a => a.getCisloVyrobku() == b.getCisloVyrobku()));
foreach (var nedostupnyVyrobek in NedostupneVyrobky)
{
if (nedostupnyVyrobek.getCisloVyrobku() == "")
continue;
if (!(nedostupnyVyrobek.getCisloVyrobku()[0] >= 'A' && nedostupnyVyrobek.getCisloVyrobku()[0] <= 'Z') )
{
log.Text = time.ToString(format) + ", Z feedu se_vytratil výrobek číslo: (" + nedostupnyVyrobek.getCisloVyrobku() + ")" + Environment.NewLine + log.Text;
zmena = true;
int index = HlidaneVyrobkyList.FindIndex(f => f.getCisloVyrobku() == nedostupnyVyrobek.getCisloVyrobku());
HlidaneVyrobkyList[index].setMnozstviVyrobku("0");
}
}
var NedostupneVyrobky2 = HlidaneVyrobkyList.Where(b => !vyrobkyVXML2.Any(a => a.getCisloVyrobku() == b.getCisloVyrobku()));
foreach (var nedostupnyVyrobek in NedostupneVyrobky2)
{
if (nedostupnyVyrobek.getCisloVyrobku() == "")
continue;
if ((nedostupnyVyrobek.getCisloVyrobku()[0] >= 'A' && nedostupnyVyrobek.getCisloVyrobku()[0] <= 'Z'))
{
log.Text = time.ToString(format) + ", Z feedu se_vytratil výrobek číslo: (" + nedostupnyVyrobek.getCisloVyrobku() + ")" + Environment.NewLine + log.Text;
zmena = true;
int index = HlidaneVyrobkyList.FindIndex(f => f.getCisloVyrobku() == nedostupnyVyrobek.getCisloVyrobku());
HlidaneVyrobkyList[index].setMnozstviVyrobku("0");
}
}
Konkrétně první foreach to projde bez problému (cca 3s).
Na druhém to ale už zamrzne.
HlidaneVyrobkyList má 666 objektů.
vyrobkyVXML má 21000 objektů
vyrobkyVXML2 má 444 objektů
Dále kód
if((nedostupnyVyrobek.getCisloVyrobku()[0] >= 'A' && nedostupnyVyrobek.getCisloVyrobku()[0] <= 'Z'))
Selectuje pouze kody začínající písmenem a naopak, pokud je podmínka !invertována, tak kódy začínající číslem.
Vidí tam oko nějaké zkušeného dravce zádrhel?
Nevěřím, že tento počet může zamrznout program, protože foreach první by měl být náročnější, než ten druhý, který právě neprojde.
Neustále tam voláš getCisloVyrobku přestože by to stačilo udělat jednou. Skládání stringů je velmi náročná operace. Lepší je použít např. StringBuilder.
Pokud tam máš něco co funguje jako identifikátor (např. to číslo výrobku) tak to ukladádej do Dictionary. Vyhledávání se tím značně urychlí.
Tak děkuji
Přepsal jsem to takhle:
A už to fachá.