388 Stimmen

Wie kann ich einen Bereich von Array-Elementen in ein neues Array klonen?

Ich habe ein Array X mit 10 Elementen. Ich möchte ein neues Array erstellen, das alle Elemente aus X enthält, die bei Index 3 beginnen und bei Index 7 enden. Natürlich kann ich leicht eine Schleife schreiben, die das für mich erledigt, aber ich möchte meinen Code so sauber wie möglich halten. Gibt es eine Methode in C#, die dies für mich tun kann?

Etwas wie (Pseudo-Code):

Array NewArray = oldArray.createNewArrayFromRange(int BeginIndex , int EndIndex)

Array.Copy passt nicht zu meinen Bedürfnissen . Die Elemente im neuen Array müssen Klone sein. Array.copy ist nur ein C-Stil memcpy Äquivalent, das ist nicht das, wonach ich suche.

32voto

Prasanth Louis Punkte 4009

In C# 8 wurde eine neue Range y Index Typ, der wie folgt verwendet werden kann:

int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Index i1 = 3;  // number 3 from beginning
Index i2 = ^4; // number 4 from end
var slice = a[i1..i2]; // { 3, 4, 5 }

Referenzen:

13voto

user3698437 Punkte 131
string[] arr = { "Parrot" , "Snake" ,"Rabbit" , "Dog" , "cat" };

arr = arr.ToList().GetRange(0, arr.Length -1).ToArray();

8voto

ShuggyCoUk Punkte 35230

Aufbauend auf Marcs Antwort, aber mit dem gewünschten Klonverhalten

public static T[] CloneSubArray<T>(this T[] data, int index, int length)
    where T : ICloneable
{
    T[] result = new T[length];
    for (int i = 0; i < length; i++)
    { 
        var original = data[index + i];
        if (original != null)
            result[i] = (T)original.Clone();            
    return result;
}

Und wenn die Implementierung von ICloneable zu anstrengend ist, kann eine reflektierende Lösung mit Håvard Strandens kopierbare Bibliothek um die erforderlichen schweren Arbeiten zu erledigen.

using OX.Copyable;

public static T[] DeepCopySubArray<T>(
    this T[] data, int index, int length)
{
    T[] result = new T[length];
    for (int i = 0; i < length; i++)
    { 
        var original = data[index + i];
        if (original != null)
            result[i] = (T)original.Copy();            
    return result;
}

Beachten Sie, dass die OX.Copyable-Implementierung mit jedem von funktioniert:

Damit die automatische Kopie funktioniert, muss jedoch eine der folgenden Aussagen zutreffen:

  • Sein Typ muss einen parameterlosen Konstruktor haben, oder
  • Es muss ein Copyable sein, oder
  • Es muss ein IInstanceProvider für seinen Typ registriert sein.

Das sollte also fast jede Situation abdecken. Wenn Sie Objekte klonen, bei denen der Subgraph Dinge wie DB-Verbindungen oder Datei-/Stream-Handles enthält, haben Sie natürlich Probleme, aber das gilt für jede verallgemeinerte Deep Copy.

Wenn Sie stattdessen einen anderen Deep-Copy-Ansatz verwenden möchten Artikel listet mehrere andere auf Ich würde daher vorschlagen, dass Sie nicht versuchen, Ihre eigenen Texte zu schreiben.

8voto

RandomNickName42 Punkte 5809

Dies ist relativ einfach zu bewerkstelligen;

    object[] foo = new object[10];
    object[] bar = new object[7];   
    Array.Copy(foo, 3, bar, 0, 7);

5voto

Sean Punkte 589

Ich glaube, der Code, den Sie suchen, lautet:

Array.Copy(oldArray, 0, newArray, BeginIndex, EndIndex - BeginIndex)

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