2010-05-17 15 views
6

C# dizisindeki bir dizinin kuyruğunu almanın en kolay yolu nedir? tüm ancak ilk unsur. I() .ToArray çağırarak mümkün olduğunca kaçınmak ve .NET yerine IEnumerable<T> kullanarak sadık kalacağınaDizinin kuyruğunu alın

+1

Sorunuzun çeşitli yorumlara vardır: Dizinin bir kopyasını istiyorsun elementler? İlk diziyi atlamak için orijinal diziyi tekrarlamak ister misin? –

cevap

13
var myArray = GetSomeArray(); 
myArray = myArray.Skip(1).ToArray(); 

Not.

+3

Ancak, yukarıdaki gibi ToArray'ı çağırırsanız, Array.Copy'yi kullanmak çok daha verimlidir, çünkü ToArray'ın diziyi uzunluk-1'de başlatma girişiyle ilgili yeterince bilgiye sahip olacağına inanmıyorum. – Josh

+1

@Josh: Bu doğrudur (ToArray'ın bir "List" i dahili olarak oluşturup "ToArray" ı * bu * ile çağırmak), ama eğer ToArray'ı hiç çağırmamak daha iyi olurdu. zorunda değildi. –

6

Array.Copy:

var array1 = new int[] { 1, 2, 3, 4, 5, 6 }; 

var array2 = new int[array1.Length - 1]; 
Array.Copy(array1, 1, array2, 0, array2.Length); 

// array2 now contains {2, 3, 4, 5, 6} 

Düzenleme: Bu tümüyle diziler kullanmaktan kaçınmak anlamına gelir çünkü Joel Coehoorn cevabı, daha iyidir!

1

Lol bana eski okul der, ama hey geçerli!

for(int i = 1; i<array.length;i++) 
{ 
    array2[i-1]=array[i]; 
} 

: P

ya da bir yöntem vardı ve sadece o sadece kuyruk ile ne yapmak istediğinize bağlıdır, onları aramak gerekirse bunları verim verebilir.

for(int i = 1; i<array.length;i++) 
{ 
    yield return array[i]; 
} 
0

Ben codeka'nın cevabını tercih ederim, çünkü çok basit ve muhtemelen en etkili yöntemlerden biri. Ancak, gördüğünüz gibi, ihtiyacınız olduğunda uygulamak en basit olanı değil.

Bir uzantı yöntemi olarak çok benzer bir şey var, bu yüzden SubArray'ı çağırabilir ve bir dizede Substring gibi davranacaktır.

şey gibi:

public static T[] SubArray<T>(this T[] array, int startIndex, int length) 
{ 
    // various null, empty, out of range checks here 

    T[] returnArray = new T[length]; 
    Array.Copy(array, startIndex, returnArray, 0, length); 
    return returnArray; 
} 

var array1 = new[] { 1, 2, 3, 4, 5 }; 
var arrays2 = array1.SubArray(2, 3); 

Aşağıdaki gibi birkaç diğer aşırı yükleri hayata geçirebileceğini:

public static T[] SubArray<T>(this T[] array, int startIndex) 
{ 
    // null check here 

    return SubArray(array, startIndex, array.Length - startIndex); 
} 
-1
using System.Linq; 

var array = new [] { 1, 2, 3, 4 }; 
var tail = array.Reverse().Take (array.Length - 1).Reverse();