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.

3voto

Obsidian Punkte 563

In C# 8.0 können Sie jetzt viele kompliziertere Arbeiten durchführen, einschließlich umgekehrter Indizes und Bereiche wie in Python, wie zum Beispiel:

int[] list = {1, 2, 3, 4, 5, 6};
var list2 = list[2..5].Clone() as int[]; // 3, 4, 5
var list3 = list[..5].Clone() as int[];  // 1, 2, 3, 4, 5
var list4 = list[^4..^0].Clone() as int[];  // reverse index

3voto

Guffa Punkte 663241

Als Alternative zum Kopieren der Daten können Sie einen Wrapper erstellen, der Ihnen den Zugriff auf einen Teil des ursprünglichen Arrays ermöglicht, als wäre er eine Kopie des Teils des Arrays. Der Vorteil ist, dass Sie keine weitere Kopie der Daten im Speicher erhalten, und der Nachteil ist ein leichter Overhead beim Zugriff auf die Daten.

public class SubArray<T> : IEnumerable<T> {

   private T[] _original;
   private int _start;

   public SubArray(T[] original, int start, int len) {
      _original = original;
      _start = start;
      Length = len;
   }

   public T this[int index] {
      get {
         if (index < 0 || index >= Length) throw new IndexOutOfRangeException();
         return _original[_start + index];
      }
   }

   public int Length { get; private set; }

   public IEnumerator<T> GetEnumerator() {
      for (int i = 0; i < Length; i++) {
        yield return _original[_start + i];
      }
   }

   IEnumerator IEnumerable.GetEnumerator() {
      return GetEnumerator();
   }

}

Verwendung:

int[] original = { 1, 2, 3, 4, 5 };
SubArray<int> copy = new SubArray<int>(original, 2, 2);

Console.WriteLine(copy.Length); // shows: 2
Console.WriteLine(copy[0]); // shows: 3
foreach (int i in copy) Console.WriteLine(i); // shows 3 and 4

2voto

crauscher Punkte 6384

Array.ConstrainedCopy wird funktionieren.

public static void ConstrainedCopy (
    Array sourceArray,
    int sourceIndex,
    Array destinationArray,
    int destinationIndex,
    int length
)

2voto

Mr. Boy Punkte 56378

Es erfüllt zwar nicht Ihre Anforderungen an das Klonen, aber es scheint einfacher zu sein als viele andere Antworten:

Array NewArray = new ArraySegment(oldArray,BeginIndex , int Count).ToArray();

1voto

Mike Punkte 3169

Wie wäre es mit der Verwendung von Array.ConstrainedCopy :

int[] ArrayOne = new int[8] {1,2,3,4,5,6,7,8};
int[] ArrayTwo = new int[5];
Array.ConstrainedCopy(ArrayOne, 3, ArrayTwo, 0, 7-3);

Unten ist mein ursprünglicher Beitrag. Es wird nicht funktionieren

Sie könnten verwenden Array.CopyTo :

int[] ArrayOne = new int[8] {1,2,3,4,5,6,7,8};
int[] ArrayTwo = new int[5];
ArrayOne.CopyTo(ArrayTwo,3); //starts copy at index=3 until it reaches end of
                             //either array

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