2016-07-21 46 views
2

Ich habe ein Array von 200 ~ Elementen und ich versuche, dieses Array in kleinere Arrays zu teilen, indem ich es für jede N Anzahl von Elementen mache, was bedeutet, dass ich die .take/.skip-Befehle nicht verwenden kann , ich habe versucht, mich zur Zeit mit verschiedenen Lösungen wie:Neues Array für jedes N-Element

einem Parallel.For und Parallel.ForEach (Welches ist das beste wäre, wenn ich könnte, dass herauszufinden)

und mit dem normalen für und foreach-Schleifen, aber stecken in dem Moment, wo alles, was ich tun kann, ist diese statische Lösung des Erstellens einer neuen Gruppe selbst foreach N Anzahl der Elemente in der arrEtikets

string[] arrEtikets = Directory.GetFiles(""); 

public string[] Group2() 
    { 
     arrEtikets.Skip(arrEtikets.Length/10); 
     return arrEtikets.Take(arrEtikets.Length/10).ToArray(); 
    } 
+0

Do u wollen eine Reihe von Auren? –

+1

Warum können Sie 'Skip' nicht verwenden? – user3185569

+1

Geben Sie Ihr Problem klar an. Directory.GetFiles() kann sehr langsam sein, ist das der Kern der Frage? Weil jeder das ignoriert. Und sind Sie auf Arrays statt List <> verkauft? –

Antwort

1

Sie können Linq verwenden, um Ihre Array in eine Liste von Arrays von Chunkgröße GroupBy ohne Skip oder Take mit aufzuspalten:

private static List<T[]> SplitToChunks<T>(T[] sequence, int chunkSize) 
{ 
    return sequence.Select((item, index) => new { Index = index, Item = item }) 
        .GroupBy(item => item.Index/chunkSize) 
        .Select(itemPerPage => itemPerPage.Select(v => v.Item).ToArray()) 
        .ToList(); 
} 

Verbrauch:

string[] arr = Enumerable.Range(0, 1000).Select(x=> x.ToString()).ToArray(); 

var result = SplitToChunks(arr, 101); 
+0

Das ist eigentlich, was ich suche, danke – Pilsneren

+0

, aber wo ich meine Datenfeld einfügen, damit es verwendet wird, und ist es dann die SplitToChunks Liste, die alle meine Arrays enthält? – Pilsneren

+0

@Pilsneren 'result' enthält eine Liste aller Ihrer Arrays. Sie können eine Schleife auf "result" durchführen – user3185569

2

Typische Skip + Take Lösung sein kann etwas wie dieses:

public static IEnumerable<T[]> SplitArrayWithLinq<T>(T[] source, int size) { 
    if (null == source) 
    throw new ArgumentNullException("source"); 
    else if (size <= 0) 
    throw new ArgumentOutOfRangeException("size", "size must be positive"); 

    return Enumerable 
    .Range(0, source.Length/size + (source.Length % size > 0 ? 1 : 0)) 
    .Select(index => source 
     .Skip(size * index) 
     .Take(size) 
     .ToArray()); 
} 

Wenn Sie nicht berechtigt sind Linq (Skip auch Take enthalten) zu verwenden:

public static IEnumerable<T[]> SplitArray<T>(T[] source, int size) { 
    if (null == source) 
    throw new ArgumentNullException("source"); 
    else if (size <= 0) 
    throw new ArgumentOutOfRangeException("size", "size must be positive"); 

    int n = source.Length/size + (source.Length % size > 0 ? 1 : 0); 

    for (int i = 0; i < n; ++i) { 
    T[] item = new T[i == n - 1 ? source.Length - size * i : size]; 

    Array.Copy(source, i * size, item, 0, item.Length); 

    yield return item; 
    } 
} 

Test (wir [1, 2, ... 8, 9] Array in 4 Artikel Stücke aufgeteilt):

var source = Enumerable.Range(1, 9).ToArray(); 

var result = SplitArray(source, 4); 

string report = String.Join(Environment.NewLine, 
    result.Select(item => String.Join(", ", item))); 

// 1, 2, 3, 4 
// 5, 6, 7, 8 
// 9   // <- please, notice that the last chunk has 1 item only 
Console.Write(report);