.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));

4 Responses to “.NET fejtörő”

  1. kpocza Says:

    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.

  2. Soczó Zsolt Says:

    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.

  3. kpocza Says:

    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.

  4. Soczó Zsolt Says:

    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.