MultiDimension Array splitten

  • C#
  • .NET (FX) 1.0–2.0

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

    MultiDimension Array splitten

    Also,

    Ich habe ein problem von dem ich nicht weiß wie ich es umsetzen soll.
    Ich habe einen Datensatz als array (z.B. ein array von strings, können aber auch andere sein).

    Sagen wir als Bsp:

    C#-Quellcode

    1. ​array test = {"Cat","dog","mouse","horse","fish","bird"};


    Nun möchte ich dieses array in mehrere arrays splitten die jedoch:
    1) Nicht die Reihenfolge verändern!
    2) Eine zufällige Anzahl (mind. 1 Item) enthalten.

    Das könnte dann so aussehen (Richtig).

    C#-Quellcode

    1. array1 = "cat", "dog";
    2. array2 = "mouse";
    3. array3 = "horse","fish","bird";


    Das hier wäre z.B. Falsch:

    C#-Quellcode

    1. array1 = "cat", "dog";
    2. array2 = "mouse";
    3. array3 = "horse","bird","fish"; <-- Reihenfolge is durcheinander!


    Diese arrays sollen jetzt in ein array von arrays gepackt werden (achtung wieder in der richtigen reihenfolge!).
    Dieses Array[][] soll dann zurück gegeben werden.
    Wie mach die das am sinnvollsten?
    Kann leider keinen Ansatz vorzeigen, da ich total unschlüssig bin wie ich das am sinnvollsten mache? :/
    C# Developer
    Learning C++

    Rikudo schrieb:

    Wie mach die das am sinnvollsten?
    Mach zunächst aus dem Input ein richtiges Array:
    Mit foreach ist sichergestellt, dass die eihenfolge stimmt, musst Du nur noch die Destination hochzählen.

    C#-Quellcode

    1. string[] test = {"Cat","dog","mouse","horse","fish","bird"};
    2. foreach (string item in test)
    3. {
    4. // mit item was machen:
    5. // select next Destination
    6. }
    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!

    Rikudo schrieb:

    Nur wie teile ich das array
    Die Ziele selbst solltest Du schon mal deklariert haben.
    Den Rest machst Du über einen bool Zufallswert: Next oder nicht Next-Destination.
    Allerdings kann es so passieren, dass Du vorn nix und hinten alles bzw. anders herum verteilst.
    Du musst also dafür sorgen, dass mindestens ein Element pro Destination vergeben wird.
    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!

    Rikudo schrieb:

    das soll dynamisch geschehen
    Dann erstell Dir zuerst die Anzahl der Out-Arrays (<= In-Array-Length) und pack das ganze in ein einen solchen höchst dynamischen Konstrukt:

    C#-Quellcode

    1. List<List<string>> ll = new List<List<string>>();
    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!

    C#-Quellcode

    1. private IEnumerable<IEnumerable<t>> giveArrays<t>(IEnumerable<t> pItems)
    2. {
    3. Random lRandom = new Random();
    4. int lNext = lRandom.Next(1, 4);
    5. while (pItems.Count() != 0)
    6. {
    7. lNext = lRandom.Next(1, pItems.Count() + 1);
    8. yield return pItems.Take(lNext);
    9. pItems = pItems.Skip(lNext);
    10. }

    C#-Quellcode

    1. string[] lItems = {"1","2","3","4","5","6","7"};
    2. foreach (var item in giveArrays(lItems))
    3. {
    4. MessageBox.Show(string.Join(Environment.NewLine, item));
    5. }

    ne dürfte auch so gehen.
    Wenn du das ganze allerdings als 2-dimensionales array haben möchtest musst du paar kleinigkeiten ändern:

    C#-Quellcode

    1. private IEnumerable<t[]> giveArrays<t>(IEnumerable<t> pItems)
    2. {
    3. Random lRandom = new Random();
    4. int lNext = lRandom.Next(1, 4);
    5. while (pItems.Count() != 0)
    6. {
    7. lNext = lRandom.Next(1, pItems.Count() + 1);
    8. yield return pItems.Take(lNext).ToArray();
    9. pItems = pItems.Skip(lNext);
    10. }
    11. }


    C#-Quellcode

    1. string[] lItems = { "1", "2", "3", "4", "5", "6", "7" };
    2. string[][] lResult = giveArrays(lItems).ToArray();



    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „RushDen“ ()

    Stark!
    Ist es mir auch noch möglich in dieser Linq query exclusions zu machen. Also if(currentitem.nextitem == "next") das dann zwischen dem aktuellen und dem nächsten (oder vorherigen) item nicht gesplittet wird so das diese im selben array landen?
    C# Developer
    Learning C++
    Hi
    so sähe btw. mein Ansatz aus:

    C#-Quellcode

    1. public static T[][] RandomSplitArray<T>(T[] input)
    2. {
    3. if (input == null)
    4. throw new ArgumentNullException("input");
    5. Random rnd = new Random();
    6. int ind = 0;
    7. //hier werden alle Elemente drinstehen
    8. List<T[]> arrays = new List<T[]>();
    9. while (ind < input.Length) //solange weitere Elemente hinzugefügt werden sollen
    10. {
    11. int c = rnd.Next(1, input.Length - ind); //gib eine zufällige Zahl an Elementen 1 <= c < n mit n : "Zahl der verbleibenden Elemente"
    12. //neues Array mit den Daten generieren
    13. T[] newArr = new T[c];
    14. Array.Copy(input, ind, newArr, 0, c);
    15. arrays.Add(newArr);
    16. ind += c;
    17. }
    18. return arrays.ToArray();
    19. }


    Den kannst du dir ja dann eigentlich so modifizieren, dass er deinen Wünschen entspricht. Mit Linq sieht's halt kryptischer aus und ist mMn. etwas schwerer, den eigenen Bedürfnissen anzupassen.

    Gruß
    ~blaze~