Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

December 22, 2015 / by Zsolt Soczó

.NET fejtörő

Élő kódból. Az első megoldás jól működik, a második nem, mi lehet az oka? A hibajelenség, hogy az első beállítja a TickerId-t az objektumon belül, a második nem.

Parallel.For(0, tickOhlcs.Count, i => tickOhlcs[i].SetTickerId(key.TickerId));

Parallel.ForEach(tickOhlcs, tickOhlc => tickOhlc.SetTickerId(key.TickerId));

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

4 COMMENTS

  • kpocza December 22, 2015

    A második IEnumerable-t vár. Esetleg hibás az IEnumerable vagy IEnumerator implementációja? Pl. a MoveNext már első kérdésre azt mondja, hogy nincs tovább.

  • Soczó Zsolt December 22, 2015

    Valójában hibás a kérdés, ha a bemeneti kollekció tömb, akkor jól működik a for, ha List, akkor a for sem.
    A kulcs az, hogy a kollekció structokat tartalmaz, nem classokat.

  • kpocza December 23, 2015

    Aham. Tehát a List indexere másol (visszetér az i. elemmmel a backing arrayből), ezért “elromlik” a For, a Foreach esetében meg persze, hogy másol, akármi van. Ellenben az array esetében a startOfArray+index*sizeof(structtype) memóriacímen található structon dolgozik és nem másol.

  • Soczó Zsolt December 23, 2015

    Igen, ez az ok, a struktúra másolódik vagy boxolódik (nem néztem meg mélyebben), így a másolaton fut let a setter.

    Mindig mondom tanfolyamokon, hogy a strukúrák elég speciális állatfajok, okkal kell csak bevetni őket.