ListOf<T> splitten

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Facebamm.

    ListOf<T> splitten

    Hallo Leute,

    ich möchte gerne eine ListOf splitten.
    Das Ergebniss soll zb. so aussehen:

    Items : 100
    Gruppen : 6 (anzahl der Gruppen soll verändert werden können)

    Gruppe 1 = 17
    Gruppe 2 = 17
    Gruppe 3 = 17
    Gruppe 4 = 17
    Gruppe 5 = 16
    Gruppe 6 = 16

    Es sollen also diese 100 Items in der ListOf aufgeteilt werden auf "fast" gleich große Gruppen.

    Bis jetzt hab ich nur eine Function, die die ListOf splitten in gleich große Teile.

    C#-Quellcode

    1. var list = new List<List<int>>();
    2. int groupcount = 6;
    3. for (int i = 0; i < Mainlist.Count; i += groupcount)
    4. {
    5. list.Add(Mainlist.GetRange(i, Math.Min(nSize, Mainlist.Count - i)));
    6. }
    7. return list;


    Komm da einfach nicht auf die Lösung, wie man das simple lösen kann.


    Vielen Dank im Voraus.
    Ich hatte mal einen BalancedQueueCreator gebastelt. Der verteilt gleichmäßig x Elemente in y Listen. Ließe sich wahrscheinlich hier nutzen.
    Aber da gibt's bestimmt auch ein einfaches mathematisches Konzept dahinter. x : y und dann geschickt runden als erster Schritt. Wahrscheinlich. Aber die Mathecracks hier im Forum können da bestimmt was Produktives liefern.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielleicht ist dies hilfreich, sonst löschen. :saint: :whistling:
    Ist das dasselbe Prinzip wie diese Geschichte?
    Zum Beispiel man hat 10 Einsen und 9 Nullen, und nun soll man die abwechselnd verteilen.
    Also

    Quellcode

    1. 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
    (bestmögliche Lösung)

    schlechtestmögliche Lösung:

    Quellcode

    1. 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0


    Wenn es sowas ist, finde ich etwas auf Mikrocontroller.net wieder ... https://www.mikrocontroller.net/topic/472747#new
    Ich hab erstmal einen Versuch gemacht, der tatsächlich erstma funktioniert.
    Jedoch ist das nicht sehr performant.

    C#-Quellcode

    1. private List<List<nTask>> SplitList(List<nTask> locations, int Groups = 2)
    2. {
    3. List<nTask>[] list = new List<nTask>[Groups];
    4. int currentgroup = 0;
    5. for (int i = 0; i < locations.Count; i++)
    6. {
    7. if (list[currentgroup] == null)
    8. list[currentgroup] = new List<nTask>();
    9. list[currentgroup].Add(locations[i]);
    10. currentgroup++;
    11. if (currentgroup >= Groups)
    12. currentgroup = 0;
    13. }
    14. var returnlist = new List<List<nTask>>();
    15. foreach (var nl in list)
    16. returnlist.Add(nl);
    17. return returnlist;
    18. }


    Ich geh erstmal alle Object der Liste durch und füge Sie dann wieder nacheinander einer neuen Liste im Array hinzu.
    @n1nja Gibt es Kriterien, nach denen aufgeteilt werden soll?
    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!
    Willst du sowas Oo

    C#-Quellcode

    1. // Gen. a list
    2. var list = Enumerable.Range(0, 100).ToList();
    3. // init
    4. int groupsCount = 6;
    5. var groups = new List<List<int>>(groupsCount);
    6. int i = 0;
    7. for(; i < groupsCount; i++)
    8. {
    9. groups.Add(new List<int>()
    10. {
    11. list[i]
    12. });
    13. }
    14. // Process
    15. for (int n = list.Count; i < n; i++)
    16. {
    17. groups[i % groupsCount].Add(list[i]);
    18. }
    19. // output
    20. foreach (var group in groups)
    21. {
    22. Console.WriteLine(string.Join(", ", group));
    23. }
    Bilder
    • Unbenannt.png

      82,75 kB, 528×116, 71 mal angesehen