366 Stimmen

Wie kann ich zwei Arrays in C# verketten?

int[] x = new int [] { 1, 2, 3};
int[] y = new int [] { 4, 5 };

int[] z = // your answer here...

Debug.Assert(z.SequenceEqual(new int[] { 1, 2, 3, 4, 5 }));

Zurzeit verwende ich

int[] z = x.Concat(y).ToArray();

Gibt es eine einfachere oder effizientere Methode?

2voto

Marko Gresak Punkte 7679

Ich habe eine elegante Ein-Zeilen-Lösung gefunden, die LINQ o Lambda Ausdruck, funktionieren beide gleich (LINQ wird bei der Kompilierung des Programms in Lambda umgewandelt). Die Lösung funktioniert für jeden Array-Typ und für eine beliebige Anzahl von Arrays.

LINQ verwenden:

public static T[] ConcatArraysLinq<T>(params T[][] arrays)
{
    return (from array in arrays
            from arr in array
            select arr).ToArray();
}

Lambda verwenden:

public static T[] ConcatArraysLambda<T>(params T[][] arrays)
{
    return arrays.SelectMany(array => array.Select(arr => arr)).ToArray();
}

Ich habe beides zur Verfügung gestellt, damit man es sich aussuchen kann. Leistung weise @Sergey Shteyn's o @deepee1's Lösungen sind etwas schneller, der Lambda-Ausdruck ist der langsamste. Die benötigte Zeit hängt vom Typ der Array-Elemente ab, aber solange es nicht Millionen von Aufrufen gibt, gibt es keinen signifikanten Unterschied zwischen den Methoden.

1voto

Siewers Punkte 22116

Sie müssen bedenken, dass Sie bei der Verwendung von LINQ die verzögerte Ausführung nutzen. Die anderen hier beschriebenen Methoden funktionieren alle einwandfrei, aber sie werden sofort ausgeführt. Außerdem ist die Funktion Concat() wahrscheinlich in einer Weise optimiert, die Sie selbst nicht durchführen können (Aufrufe interner APIs, Betriebssystemaufrufe usw.). Wie auch immer, solange Sie nicht wirklich versuchen müssen, zu optimieren, sind Sie derzeit auf dem Weg zur "Wurzel allen Übels" ;)

1voto

Versuchen Sie das Folgende:

T[] r1 = new T[size1];
T[] r2 = new T[size2];

List<T> targetList = new List<T>(r1);
targetList.Concat(r2);
T[] targetArray = targetList.ToArray();

0voto

mezoid Punkte 27286

Für int[] sieht das, was Sie gemacht haben, gut aus. von einem Fremden Antwort würde auch gut funktionieren für List<int> .

0voto

Michail Michailidis Punkte 10896

Für kleinere Arrays <10000 Elemente:

using System.Linq;

int firstArray = {5,4,2};
int secondArray = {3,2,1};

int[] result = firstArray.ToList().Concat(secondArray.ToList()).toArray();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X