List(Of T) gleichmäßig aufteilen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

    List(Of T) gleichmäßig aufteilen

    Hallo Gemeinde.

    Ich habe eine große List(Of T) mit x-Einträgen.

    Nun möchte ich diese Liste auf 4 (Sub-)Listen "herunterbrechen". Die Anzahl der Einträge soll hierbei gleichmäßig verteilt sein.

    z.B. die große Liste hat 120 Einträge. So sollen die Sub-Listen (A-D) jeweils 30 Einträge besitzen.

    Wie macht man so etwas? Arbeitet man die irgendwie mit Modulo 4?

    Ein Beispielcode wäre wünschenswert. Vielen Dank!
    Hintergrund:

    Die Liste beinhaltet Pfade zu Dateien. Ich habe eine Klasse, die diese Liste übergeben bekommt und die Dateien weiterverarbeitet.

    Nun möchte ich nicht eine Instanz der Klasse erzeugen, sondern deren 4 und jeder Instanz einen Bruchteil der Gesamtliste zur Abarbeitung übergeben.

    Zudem soll jede Instanz in einem eigenen Thread laufen.
    Mach Dir ein Array von n List(Of X),
    eine For-Schleife über alle Elemente der Master-List Step n
    eine geschachtelte Schleife von 0 bis n-1, dieser Laufindex ist der Index des Arrays der n List(Of X),
    nur noch kopieren, Master-Index hochzählen und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Schön, aber das muss doch auch irgendwie eleganter über eine For Each - Schleife gehen?

    Hatte schon an soetwas gedacht (pseudo-code):

    Dim ele_cnt as UInteger = 0
    For Each element In großeListe

    If(elem_cnt And 1) then
    ' füge Element in Liste A ein
    elseIf(elem_cnt And 2) then
    ' füge Element in Liste B ein
    elseIf(elem_cnt And 3) then
    ' füge Element in Liste C ein
    elseIf(elem_cnt And 4) then
    ' füge Element in Liste D ein

    endif

    elem_cnt = elem_cnt + 1

    Next

    TuxuT schrieb:

    Hatte schon an soetwas gedacht (pseudo-code):
    Steht doch alles da.

    RodFromGermany schrieb:

    Mach Dir ein Array von n List(Of X),
    Probier mal, es umzusetzen. Wenn Du Probleme hast, frag einfach.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo,

    habs nicht getestet:

    VB.NET-Quellcode

    1. ' Listen:
    2. Dim liste As New List(Of String)
    3. Dim subliste1 As New List(Of String)
    4. Dim subliste2 As New List(Of String)
    5. Dim subliste3 As New List(Of String)
    6. Dim subliste4 As New List(Of String)
    7. ' Sublistennummer
    8. Dim sublistenummer As Integer = 1
    9. ' Einordnung
    10. For Each element In liste
    11. Select Case sublistenummer
    12. Case 1
    13. subliste1.Add(element)
    14. sublistenummer += 1
    15. Case 2
    16. subliste2.Add(element)
    17. sublistenummer += 1
    18. Case 3
    19. subliste3.Add(element)
    20. sublistenummer += 1
    21. Case 4
    22. subliste4.Add(element)
    23. sublistenummer = 1
    24. End Select
    25. Next


    Das ist ein Beispiel mit List(Of String).

    Kann man natürlich anpassen.

    Ich hoffe, ich konnte dir helfen.

    MFG

    Alex-Digital :D

    EDIT:

    Hab mich im Code wegschrieben. Alter Code kann zu Fehlern führen.
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    Die Liste beinhaltet Pfade zu Dateien. Ich habe eine Klasse, die diese Liste übergeben bekommt und die Dateien weiterverarbeitet.
    Nun möchte ich nicht eine Instanz der Klasse erzeugen, sondern deren 4 und jeder Instanz einen Bruchteil der Gesamtliste zur Abarbeitung übergeben.
    Zudem soll jede Instanz in einem eigenen Thread laufen.

    Warum genau 4? Die Aufteilung der Liste ist nicht der logische Vorgang.
    Du musst dir bei diesem Vorgang ein Büro vorstellen, welches eine bestimmte Menge an gleicher Arbeit hat. Zuerst stellst du vier Leute ein, die diese Arbeit erledigen. Dann gibst du jedem(!) einen Stapel der Arbeit. Was wäre jetzt, wenn jemand länger braucht, und der andere schneller fertig wird (aus welchen Gründen auch immer)? Das ist der Klassiker in jedem Büro. Eine Person, die in Arbeit versinkt, und die anderen sind auf Rauchpause :rolleyes:

    Richtig wäre: Du definierst die Arbeit, die erledigt gehört, und die Anzahl der Leute, die das erledigen soll (=Anzahl der Threads). Dann lässt du sie die Arbeit von einem(!) Stapel nehmen. Ist dort noch etwas, nimmt sich der nächste dort etwas weg, und niemand muss sinnlos rumstehen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „der_Kurt“ ()

    "Zudem soll jede Instanz in einem eigenen Thread laufen."

    Vllt ist es ja auch eine alternative die Gesamtliste mit einer parallel.for-schleife zu bearbeiten. Dann brauchst du dich nichtmal darum zu kümmern wie viele Threads du anlegst. Bei einem Dualcore machen 4 weniger Sinn, hingegen ist ein QuadCore mit nur 2 Threads nicht ausgelastet.

    Wenn es um Dateien geht mutmaße ich mal, dass Multithreading nur bis zu einem gewissen Rahmen Sinn macht. Wenn die Zeit, die für das "Arbeiten" aufgebracht werden muss verschwindend gering ist und die Zeit für Festplattenzugriffe überwiegt, dann könnten mehre Threads u.U. sogar ausbremsen. Der Lesekopf kann halt nur an einer Position gleichzeitig sein, das hin- und herspringen kostet. Da wird es aber sicherlich riesige Unterschiede geben, je nach Dateigrößen, Festplattentyp, Rechenaufwand der mit den Informationen betrieben wird, etc.

    Aber wie der_Kurt schon sagt, ein Stapel (=>Stack) wäre hier vllt besser.

    Btw gibt es da auch ein Entwurfsmuster "Master-Slave" (oder Meister und Gehilfe). Dem Meister übergibst du die komplette Liste und bekommst von ihm das Ergebnis der Arbeit geliefert. Wie der Meister seine Sklaven scheucht, wie viele er hat und wie er die Arbeit aufteilt bleibt ihm überlassen^^