Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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.

Předmět Autor Datum
Neustále tam voláš getCisloVyrobku přestože by to stačilo udělat jednou. Skládání stringů je velmi n…
Wikan 26.06.2017 14:11
Wikan
Jj. Pravda, zkusím s tím něco udělat.
Flash_Gordon 26.06.2017 14:17
Flash_Gordon
Tak děkuji :beer: Přepsal jsem to takhle: StringBuilder builder = new StringBuilder(); foreach (V… poslední
Flash_Gordon 26.06.2017 14:24
Flash_Gordon

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 :beer:

Přepsal jsem to takhle:

 StringBuilder builder = new StringBuilder();
            foreach (Vyrobek nedostupnyVyrobek in NedostupneVyrobky2)
            {
                if (nedostupnyVyrobek.getCisloVyrobku() == "")
                    continue;
                if ((nedostupnyVyrobek.getCisloVyrobku()[0] >= 'A' && nedostupnyVyrobek.getCisloVyrobku()[0] <= 'Z'))
                {
                    builder.Append(time.ToString(format));
                    builder.Append(", Z feedu se_vytratil výrobek číslo: (");
                    builder.Append(nedostupnyVyrobek.getCisloVyrobku());
                    builder.Append(Environment.NewLine);
                    
                    
                    zmena = true;

                    int index = HlidaneVyrobkyList.FindIndex(f => f.getCisloVyrobku() == nedostupnyVyrobek.getCisloVyrobku());
                    HlidaneVyrobkyList[index].setMnozstviVyrobku("0");
                }
            }

            builder.Append(log.Text);
            log.Text = builder.ToString() + textBox1.Text  ;

A už to fachá.

Zpět do poradny Odpovědět na původní otázku Nahoru