Gibt es in .NET 2.0 eine integrierte Funktion, die zwei Arrays verwendet und zu einem Array zusammenführt?
Die Arrays sind beide vom gleichen Typ. Ich erhalte diese Arrays von einer weit verbreiteten Funktion in meiner Codebasis und kann die Funktion nicht ändern, um die Daten in einem anderen Format zurückzugeben.
Ich möchte vermeiden, meine eigene Funktion zu schreiben, um dies zu erreichen, wenn dies möglich ist.
Array.Resize
die Größe des Arrays nicht geändert wird, sondern kopiert wird. Aus diesem Grund ist der erste Parameter by-ref (was bedeutet, dass Ihr erster Code wahrscheinlich nicht kompiliert wird).In C # 3.0 können Sie die Concat- Methode von LINQ verwenden, um dies einfach zu erreichen:
In C # 2.0 haben Sie keinen so direkten Weg, aber Array.Copy ist wahrscheinlich die beste Lösung:
Dies könnte leicht verwendet werden, um Ihre eigene Version von zu implementieren
Concat
.quelle
Verwenden Sie LINQ :
Beachten Sie, dass dadurch Duplikate entfernt werden. Wenn Sie Duplikate behalten möchten, verwenden Sie Concat.
quelle
Wenn Sie keine Duplikate entfernen möchten, versuchen Sie dies
Verwenden Sie LINQ:
quelle
Stellen Sie sich zunächst die Frage "Soll ich hier wirklich ein Array verwenden"?
Wenn Sie nicht etwas erstellen, bei dem Geschwindigkeit von größter Bedeutung ist, ist eine typisierte Liste
List<int>
wahrscheinlich der richtige Weg. Das einzige Mal, dass ich Arrays verwende, sind Byte-Arrays, wenn Dinge über das Netzwerk gesendet werden. Davon abgesehen berühre ich sie nie.quelle
List<T>
in öffentlichen APIs zu vermeiden : blogs.msdn.com/b/kcwalina/archive/2005/09/26/474010.aspxEinfacher wäre nur die Verwendung von LINQ :
Konvertieren Sie zuerst die Arrays in Listen und führen Sie sie zusammen ... Danach konvertieren Sie die Liste einfach zurück in ein Array :)
quelle
Ich denke, Sie können Array.Copy dafür verwenden. Es werden ein Quellindex und ein Zielindex benötigt, damit Sie das eine Array an das andere anhängen können. Wenn Sie komplexer werden müssen, als nur eines an das andere anzuhängen, ist dies möglicherweise nicht das richtige Werkzeug für Sie.
quelle
Angenommen, das Zielarray verfügt über genügend Speicherplatz,
Array.Copy()
funktioniert. Sie können auch versuchen, aList<T>
und seine.AddRange()
Methode zu verwenden.quelle
Persönlich bevorzuge ich meine eigenen Spracherweiterungen, die ich für Rapid Prototyping nach Belieben hinzufüge oder entferne.
Das Folgende ist ein Beispiel für Zeichenfolgen.
Es ist viel schneller als LINQ und Concat. Noch schneller wird ein benutzerdefinierter
IEnumerable
Type-Wrapper verwendet, der Referenzen / Zeiger von übergebenen Arrays speichert und das Durchlaufen der gesamten Sammlung ermöglicht, als wäre es ein normales Array. (Nützlich in HPC, Grafikverarbeitung, Grafik-Rendering ...)Dein Code:
Den gesamten Code und eine generische Version finden Sie unter: https://gist.github.com/lsauer/7919764
Hinweis: Dies gibt ein nicht erweitertes IEnumerable-Objekt zurück. Das Zurückgeben eines erweiterten Objekts ist etwas langsamer.
Ich habe solche Erweiterungen seit 2002 zusammengestellt, wobei viele Credits an hilfreiche Leute in CodeProject und 'Stackoverflow' gingen. Ich werde diese in Kürze veröffentlichen und den Link hier einfügen.
quelle
Jeder hat bereits zu Wort gekommen, aber ich denke, dies ist lesbarer als der Ansatz "Als Erweiterungsmethode verwenden":
Es kann jedoch nur verwendet werden, wenn 2 Arrays zusammengeführt werden.
quelle
Das habe ich mir ausgedacht. Funktioniert für eine variable Anzahl von Arrays.
...
quelle
Nur um es als Option notieren zu lassen: Wenn die Arrays, mit denen Sie arbeiten, vom primitiven Typ sind - Boolescher Wert (Bool), Char, SByte, Byte, Int16 (kurz), UInt16, Int32 (int), UInt32, Int64 (lang) ), UInt64, IntPtr, UIntPtr, Single oder Double - dann könnten (oder sollten?) Sie versuchen, Buffer.BlockCopy zu verwenden . Laut der MSDN-Seite für die Pufferklasse :
Mit dem C # 2.0-Beispiel aus der Antwort von @ OwenP als Ausgangspunkt würde es wie folgt funktionieren:
Es gibt kaum einen Unterschied in der Syntax zwischen
Buffer.BlockCopy
und der vonArray.Copy
@OwenP verwendeten, aber diese sollte schneller sein (wenn auch nur geringfügig).quelle
Falls jemand anderes nach Möglichkeiten sucht, zwei Bildbyte-Arrays zusammenzuführen:
quelle
Hier ist ein einfaches Beispiel für die Verwendung von Array.CopyTo. Ich denke, dass es Ihre Frage beantwortet und ein Beispiel für die Verwendung von CopyTo gibt. Ich bin immer verwirrt, wenn ich diese Funktion verwenden muss, da die Hilfe etwas unklar ist. Der Index ist die Position im Zielarray, an der das Einfügen erfolgt.
Einfacher geht es wohl nicht.
quelle
Ich brauchte eine Lösung, um eine unbekannte Anzahl von Arrays zu kombinieren.
Überrascht bot niemand sonst eine Lösung
SelectMany
mitparams
.Wenn Sie keine eindeutigen Elemente möchten, entfernen Sie einfach unterschiedliche Elemente.
Hinweis: Es gibt definitiv keine Garantie für die Bestellung bei Verwendung von eindeutigen.
quelle
Ich gehe davon aus, dass Sie im Gegensatz zu den integrierten .NET-Arrays Ihre eigenen Array-Typen verwenden:
Eine andere Möglichkeit wäre die Verwendung der integrierten ArrayList-Klasse.
Beide Beispiele sind C #.
quelle
Mit dem obigen Code können zwei Arrays einfach zusammengeführt werden.
quelle
Erstellt und Erweiterungsmethode für Null
quelle
Wenn Sie die Quell-Arrays in einem Array selbst haben, können Sie SelectMany verwenden :
gibt
Wahrscheinlich ist dies nicht die schnellste Methode, könnte aber je nach Anwendungsfall passen.
quelle
Dieser Code funktioniert in allen Fällen:
quelle
Versuche dies:
quelle