Laden...

Nur jeden vierten Index picken

Erstellt von sharper vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.328 Views
S
sharper Themenstarter:in
15 Beiträge seit 2006
vor 15 Jahren
Nur jeden vierten Index picken

Hallo,

mag sein das meine Frage etwas dumm ist aber ich komm gerade nicht drauf. Wie kann ich in einem Array nur jedes Vierte oder von mir aus auch jedes Xte object picken mithilfe einer For-Schleife ??

U
105 Beiträge seit 2004
vor 15 Jahren

Beim Step gibst du anstelle von i++ was anderes an (z.B. i += 4).

K
593 Beiträge seit 2007
vor 15 Jahren

Hallo,

ich weiß jetzt nicht ob ich dein Problem zu trivial finde aber mit etwas wie :


for (int i = 0; i<x; i +=4)
{
      array[i];
}

wird jedes 4te element gewählt.

Gruß Daniel

S
sharper Themenstarter:in
15 Beiträge seit 2006
vor 15 Jahren

Danke.
Man ich hatte voll das Blackout, bin heute sowieso ziemlich Müde. Danke nochmal. 🙂

1.696 Beiträge seit 2006
vor 15 Jahren

Hallo Kaji,

nope, der 2. Durchlauf springt um 5 und erst danach 4 😁

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

K
593 Beiträge seit 2007
vor 15 Jahren

Hallo,

wie kommst du darauf ?0+4=4 und 4+4=8? Es kommt nur drauf an ob man beim 0ten Eintrag anfängt oder nicht. Wenn du Eintrag 0 mit einrechnest dann geht es genau auf, wovon ich ausgegangen war 🙂

5.742 Beiträge seit 2007
vor 15 Jahren

Hallo zusammen,

in diesem Zusammenhang ist auch der Modulo Operator oft hilfreich.

1.696 Beiträge seit 2006
vor 15 Jahren

Hallo,

wie kommst du darauf ?0+4=4 und 4+4=8? Es kommt nur drauf an ob man beim 0ten Eintrag anfängt oder nicht. Wenn du Eintrag 0 mit einrechnest dann geht es genau auf, wovon ich ausgegangen war 🙂

OOps ... ich glaube, ich langsam aufhören ... sorry 😁

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo zusammen,

wenn man solche Schleifen baut, um dann im Rumpf auf a_, a[i+1], a[i+2] und a[i+3] zuzugreifen, dann musst bei der Schleifenbedingung aufpassen. i < a.Length wäre dann fatal, wenn nicht sichergestellt ist , dass die Anzahl der Element durch 4 teilbar ist.

herbivore

925 Beiträge seit 2004
vor 15 Jahren

C# 3.0? Da ließe sich doch sicher 'ne Extension bauen oder?

sowas wie



        public static IEnumerable<T> Every<T>(this IEnumerable<T> FromEnum, int x)
        {
            List<T> tList = FromEnum.ToList<T>();
            var tQuery = from T pElement in tList
                         where (tList.IndexOf(pElement) % x) == 0
                         select pElement;

            return tQuery;
        }


Die Methoed müsste eigentlich jedes Element liefern, deren Index sich durch x teilen lässt - also jedes x-te Element.

Bitte mal um Verifizierung, ob die genannte Methode tut, was sie soll. Kann das gerade nicht testen. Danke!

K
165 Beiträge seit 2007
vor 15 Jahren

Hallo Alle 🙂,

ich will jetzt nicht klugscheissen 😁 aber winSharp93 hat doch schon die (meiner Meinung nach) eleganteste Lösung verraten.

in diesem Zusammenhang ist auch der Modulo Operator oft hilfreich.

for(int i = 0; i < Array.Length;i++)
{
    if(i % 4 == 0)
    {
        //muh
    }
}

Schneller, simpler und leserlicher gehts doch nicht, oder?

Kalleberlin

If u want to finish first, u have to finish first.
925 Beiträge seit 2004
vor 15 Jahren

Aber warum das Rad neu erfinden, wenn C# schon die nötigen Werkzeuge für soetwas bietet?

Naja, man kann ja mal 'nen Performance-Test fahren.

Ist meine Variante Thread-Safe? Ich bin mir gerade nicht sicher. Eure jedenfalls nicht.

K
165 Beiträge seit 2007
vor 15 Jahren

Hallo 7.e.Q,

vebesser mich wenn ich falsch liege, aber

a: Was ist daran nicht C# Werkzeug?
b: Was ist daran nicht Threadsafe?

Kalleberlin

If u want to finish first, u have to finish first.
925 Beiträge seit 2004
vor 15 Jahren

Hmmm, auf den ersten Blick...

a: klar, zufuß kommt man auch voran?
b: was, wenn während eines Schleifendurchlaufs in einem anderen Thread das Array oder ein Eintrag geändert, verschoben, getauscht, etc. wird?

Okay, mag sein, daß die Lösung einfach zu banal ist, um nicht thread-safe zu sein. Ist schon vergleichsweise spät. Ist mir gerade zu hoch, darüber intensiver nachzudenken.

K
165 Beiträge seit 2007
vor 15 Jahren

b: was, wenn während eines Schleifendurchlaufs in einem anderen Thread das Array oder ein Eintrag geändert, verschoben, getauscht, etc. wird?

Ok, ich denke da hast Du recht. Ich weiss es zwar nur ganz genau wenn wir von einer List<T> sprechen würden (da würde es auf jedenfall knallen), deshalb denke ich Du hast da recht 😄.

Kalleberlin

If u want to finish first, u have to finish first.
O
778 Beiträge seit 2007
vor 15 Jahren

@7.e.Q.

naja, deine Variante ist deutlich weniger performant. Überhaupt ist jeder Zugriff über IEnumerable (<T>) auf eine Liste oder ein Array, bei dem man direkt auf den Index des Elements zugreifen muss, auf jedenfall performancemäßig deutlich schlechter als manuell durch die Liste zu iterieren. Insofern ist hier das neu erfundene Rad deutlich schneller als zumindest Linq.

Und wegen threadsafe seh ich bei der Variante von Kalleberlin noch keinen Grund, warum die nicht mehr threadsafe sein kann, es gibt ja nur einen Zugriff auf eine lokal definierte Variable, auf die haben andere Threads keinen Zugriff. Der Code muss am Ende nicht threadsafe sein, aber wenn er es nicht ist, dann nicht wegen diesem Stück Code.

Also ich würde die Variante von Kalleberlin nehmen...

//edit: ja, stimmt, das Array müsste man noch absichern, dann ist's threadsafe. ist halt die Frage wo das Arrayherkommt...

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Kalleberlin,

Schneller, simpler und leserlicher gehts doch nicht, oder?

die i += 4 Variante ist auf jeden Fall schneller und simpler finde ich sie auch.

herbivore

K
165 Beiträge seit 2007
vor 15 Jahren

Hallo herbivore 🙂,

du selbst sagst doch aber :

wenn man solche Schleifen baut, um dann im Rumpf auf a_, a[i+1], a[i+2] und a[i+3] zuzugreifen, dann musst bei der Schleifenbedingung aufpassen. i < a.Length wäre dann fatal, wenn nicht sichergestellt ist , dass die Anzahl der Element durch 4 teilbar ist.

Was wiederum eine weitere Prüfung nach sich ziehen würde...
Das vermeidet man mittels des % Operators.

Kalleberlin

//Edit:

Und ob warum soll i+=4 schneller als i % 4 == 0 sein?

If u want to finish first, u have to finish first.
49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Kalleberlin,

Das vermeidet man mittels des % Operators.

nö, tut man nicht. Bei for (int i = 0; i < Array.Length; i++) if (i % 4 == 0) werden im innersten Block genau die gleichen Indexwerte berücksichtigt wie bei for (int i = 0; i < Array.Length; i += 4), nur dass die Schleife selbst bei der i % 4 == 0 Variante unnötigerweise viermal so oft durchlaufen wird und die im Vergleich zu den anderen Operationen teuere Modulo-Operation benutzt. Stelle dir vor, man will nur jeden tausendsten Index.

herbivore

K
165 Beiträge seit 2007
vor 15 Jahren

Ach ich Idiot 😄!!!
An i += 4 innerhalb der for-Schleife hab ich depp gerade natürlich nicht gedacht!!

Bestes Zeichen zum schlafen gehen 😁

Gute Nacht 🙂

If u want to finish first, u have to finish first.
3.971 Beiträge seit 2006
vor 15 Jahren

Wenn man seine App auf Geschwindigkeit auslegen möchte, ist es wichtig, dass man Operationen wie beispielsweise Modulo so gut es geht vermeidet und stattdessen auf (einfache) Addition und Multiplikation seine Algorithmen aufbaut.

In Zeiten von .NET und derzeit guten leistungsfähigen Rechner, wird man zwar das nur in Echtzeitsystemen berücksichtigen müssen, aber wie Herbivore schreibt bei einem Step von 1000 muss es absolut nicht sein.

Ist zwar nur eine Kleinigkeit, die man einspart, man muss aber dennoch nicht sinnlos Ressourcen verbraten.

Und in dem Sinne:
Mühsam ernährt sich das Eichhörnchen....

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

F
10.010 Beiträge seit 2004
vor 15 Jahren

Modulo dauert nicht länger als ein Div, da lediglich ein anderes Prozessorregister
den Rückgabewert beinhaltet.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo FZelle,

schon klar, aber es dauert halt länger als Additionen.

Und dann kommt ja noch dazu, dass die Schleife selbst öfter durchlaufen wird, also statt einem Add und einem Vergleich hat man vier Adds, vier Modulos und acht Vergleiche, was insgesamt vermutlich 10 mal so teuer wäre.

herbivore

5.742 Beiträge seit 2007
vor 15 Jahren

die i += 4 Variante ist auf jeden Fall schneller und simpler finde ich sie auch.

Das ist auch meine Meinung.
Daher habe ich meinen Beitrag auch eher als Ergänzung formuliert:

in diesem Zusammenhang ist auch der Modulo Operator oft hilfreich.

Wenn man nämlich sowieso alle Elemente durchgehen muss und jedem n. Element eine spezielle Behandlung zukommen lassen will, wäre das z.B. wirklich ein Fall für den Modulo Operator.

U
1.688 Beiträge seit 2007
vor 15 Jahren