Opsplitning af et array i 2 arrays C#

Edit: jeg har prøvet at Tage/Springe metode, men jeg får følgende fejl:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<string>' to   
'string[]'. An explicit conversion exists (are you missing a cast?)

Jeg ikke ved hvad jeg gør forkert, fordi jeg har kopieret Saeed ‘ s kode.

Jeg har et string array (indeholder alt fra 20 til 300 poster) og jeg ønsker at dele det op i 2 separate arrays, fra midten af det første.

Jeg ved, hvordan jeg kan gøre dette ved hjælp af en for-løkke, men jeg ville gerne vide, om der var en hurtigere/bedre måde at gøre det. Jeg har også brug for at være i stand til korrekt at splitte et array, selv om det har et ulige antal elementer, f.eks:

string[] words = {"apple", "orange", "banana", "pear", "lemon"};
string[] firstarray, secondarray;
SplitArray(words, out firstarray, out secondarray); //Or some other function
//firstarray has the first 3 of the items from words, 'apple', 'orange' and 'banana'
//secondarray has the other 2, 'pear' and 'lemon'
For at løse dine stemmer problem tilføje .ToArray() efter at Tage og springe metoder

OriginalForfatteren matthewr | 2012-05-22

5 svar

  1. 46

    Du kan bruge linq:

    firstArray = array.Take(array.Length / 2).ToArray();
    secondArray = array.Skip(array.Length / 2).ToArray();

    Hvorfor det virker, på trods af pariteten af den oprindelige array-størrelse?

    Den firstArray tager array.Length /2 elementer, og det andet springer den første array.Length /2 elementer, betyder det, at der ikke er nogen konflikt mellem disse to arrays. Selvfølgelig, hvis antallet af elementer er ulige, kan vi ikke opsplitte array i to lige store dele.

    Hvis du ønsker at have flere elementer i den første halvdel (i særlige tilfælde), skal du gøre dette:

    firstArray = array.Take((array.Length + 1) / 2).ToArray();
    secondArray = array.Skip((array.Length + 1) / 2).ToArray();
    Tak, jeg vil forsøge dette snart, men vil håndtere denne opdeling korrekt, selv hvis det er et ulige antal elementer?
    Ja altid fungerer fint.
    Tak, jeg har ikke læst hans kommentarer, jeg har opdateret svar i henhold til din note. (Også jeg er Saeed, ikke Saaed 🙂
    Det betyder ikke rigtig noget, der array (firstarray eller secondarray) har den ekstra en vare, men tak for kommentaren!
    4 bliver min ven og kollega + nyttigt at svare 😉

    OriginalForfatteren Saeed Amiri

  2. 5
    string[] words = {"apple", "orange", "banana", "pear", "lemon"};
    int mid = words.Length/2;
    string[] first = words.Take(mid).ToArray();
    string[] second = words.Skip(mid).ToArray();
    Tak! Jeg vil prøve det snart.

    OriginalForfatteren Asif Mushtaq

  3. 4

    Hvis du ikke vil/kan ikke bruge LINQ kan du blot gøre:

        string[] words = { "apple", "orange", "banana", "pear", "lemon" };
        string[] firstarray, secondarray;
        int mid = words.Length / 2;
        firstarray = new string[mid];
        secondarray = new string[words.Length - mid];
        Array.Copy(words, 0, firstarray, 0, mid);
        Array.Copy(words, mid, secondarray, 0, secondarray.Length);

    OriginalForfatteren Francesco Baruchelli

  4. 4

    En mere generel tilgang, som vil dele det op i så mange dele som du angiver:

    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> list, int parts)
            {
              return list.Select((item, index) => new {index, item})
                           .GroupBy(x => (x.index + 1) / (list.Count()/parts) + 1)
                           .Select(x => x.Select(y => y.item));
            }

    *Redigeret Tak skarmats

    Dette vil ændre rækkefølgen af ting. Så den n ‘te resulterende array vil ikke svare til den n’ te afsnit af kilden.
    Opdateret for at forhindre striber array.

    OriginalForfatteren Totero

  5. 2
    string[] words = { "apple", "orange", "banana", "pear", "lemon" };
    var halfWay = words.Length/2;
    
    var firstHalf = words.Take(halfWay);
    var secondHalf = words.Skip(halfWay);

    OriginalForfatteren Nope

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *