Es könnte ein wenig seltsam erscheinen, aber es blieb wahrscheinlich aus Entwicklern zu verhindern, dass das Schreiben von Code zu leicht mit schlechter Leistung. (Wenn Sie ein neues Element in die Mitte einfügen, möchten Sie wahrscheinlich eine veränderbare Sammlung wie List<T>
.) Die einzige Möglichkeit zum Einfügen in eine Sammlung mit fester Größe wie Array
ist das Kopieren der Inhalte der Sammlung in eine neue Sammlung und legte den Artikel dort. Offensichtlich ist dies nicht die beste Idee, wenn Sie viele Einfügungen durchführen.
Wenn die Verwendung eines T[]
Array außerhalb Ihrer Kontrolle, und das Einsetzen ist notwendig, um das Array zu kopieren, sich zumindest vorzuziehen, um den Code, die Sie haben, wie es Ihnen zwei teure Operationen erspart: eine Kopie und eine Insertion Dies erfordert, dass potenziell viele Elemente um einen Index "verschoben" werden. (Ihre aktuelle Lösung kopiert den Inhalt des long[]
in eine List<long>
, fügt dann ein Element in diesem List<long>
, dann Kopien, die List<long>
zurück in eine neue long[]
.)
In diesem Fall (die Wahl eines T[]
ist nicht verhandelbar), könnten Sie eine Erweiterungsmethode zu tun, was ich oben beschrieben habe. Auf diese Weise haben Sie zumindest ein wiederverwendbares Stück Code für Szenarien, wenn Sie dieses Verhalten benötigen tun. Etwas wie:
public static class ArrayHelper
{
public static T[] Insert<T>(this T[] source, int index, T item)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (index < 0 || index > source.Length)
{
throw new ArgumentOutOfRangeException("index");
}
// Allocate a new array with enough space for one more item.
T[] result = new T[source.Length + 1];
// Copy all elements before the insertion point.
for (int i = 0; i < index; ++i)
{
result[i] = source[i];
}
// Insert the new value.
result[index] = item;
// Copy all elements after the insertion point.
for (int i = index; i < source.Length; ++i)
{
result[i + 1] = source[i];
}
return result;
}
}
Beachten Sie, dass die oben ist deutlich effizienter als das, was Sie jetzt haben, da sie nur die äquivalent eine vollständige Array Kopie eine Zeit (nicht zweimal) ausführen muss, und es auch doesn Es bedarf keiner Zwischenschaltung von Elementen.
Verbrauch:
int[] numbers = new int[] { 2, 3, 4 };
numbers = numbers.Insert(0, 1);
foreach (int number in numbers)
{
Console.WriteLine(number);
}
Ausgang:
1
2
3
4
Gibt es Gründe, Sie verwenden ein Array über eine Liste? –
Es fiel mir seltsam, auch von PHP zu kommen, aber was Sie haben, ist, was ich in C verwenden würde # – Dinah
Es ist nichts in die Array-Klasse eingebaut, denn das ist, was die Liste Klasse für –