Daten in "Pakete" packen ....

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von slice.

    Daten in "Pakete" packen ....

    Moin!

    ich habe 2358 Werte und möchte 999er Pakete packen.

    Es würden 3 Pakete werden.

    1-999
    1000-1999
    2000-2358

    Normalerweise könnte man das mit einer For-Next-Schleife löschen - aber spätestens im 3 Paket kommte es zu einem Fehler, weil der Index ungültig ist.

    Nun könnte man immer testen, ob der max. Index erreicht wurde und dann ein exit-for .... aber geht es auch eleganter?

    Gruß Jan

    VB.NET-Quellcode

    1. ​Public Shared Iterator Function SliceArray(ByVal array As Byte(), ByVal bytesPerSlice As Integer) As IEnumerable(Of Byte())
    2. Dim currentLength = 0
    3. While currentLength < array.Length
    4. Dim len As Integer = Math.Min(bytesPerSlice, array.Length - currentLength)
    5. Dim buffer = New Byte(len - 1) {}
    6. Array.Copy(array, currentLength, buffer, 0, len)
    7. Yield buffer
    8. currentLength += bytesPerSlice
    9. End While
    10. End Function
    Und Gott alleine weiß alles am allerbesten und besser.
    Ich hatte mir vor Jahren dafür mal eine Chunk-Methode geschrieben die mit Linq arbeitet:
    Spoiler anzeigen

    C#-Quellcode

    1. /// <summary>
    2. /// Chunks a List&lt;T&gt;
    3. /// </summary>
    4. /// <typeparam name="T">The type of elements in the list.</typeparam>
    5. /// <param name="source">source</param>
    6. /// <param name="chunkSize">desired chunk size</param>
    7. /// <returns>Chunked List&lt;T&gt;</returns>
    8. public static List<List<T>> Chunk<T>(this List<T> source, int chunkSize)
    9. {
    10. List<List<T>> chunked = new List<List<T>>();
    11. for (int i = 0; i < source.Count; i = i + chunkSize)
    12. {
    13. chunked.Add(source.Skip(i).Take(chunkSize).ToList<T>());
    14. }
    15. return chunked;
    16. }


    Ab .Net 6 gibt es Enumerable.Chunk