2008-09-25 24 views
31

Bildiğiniz C# boyutunda dinamik boyut dizisini başlatmak için en ince yol nedir?C# Array başlatması - varsayılan değeri olmayan

Bu benim

private bool[] GetPageNumbersToLink(IPagedResult result) 
{ 
    if (result.TotalPages <= 9) 
     return new bool[result.TotalPages + 1].Select(b => true).ToArray(); 

    ... 

cevap

34

kullanım Enumerable.Repeat

Enumerable.Repeat(true, result.TotalPages + 1).ToArray() 
+1

Şimdi bu sadece kaygan! – Rob

+12

Nigel'in performans notunun bir söz verdiğini düşünüyorum - http://stackoverflow.com/questions/136836/c-array-initialization-with-non-default-value/1051227#1051227 – CrimsonX

+9

İnsanların, Yani 'bulanık' (benim görüşüme göre) ve bir dizi doldurma kadar basit bir işlem için maliyetli. 'var arr = new type [10]; (int i = 0; i Aidiakapi

0

Untested ile gelebilir en iyisi, ama sadece bu yapabilirdi?

return result.Select(p => true).ToArray(); 

"Yeni boole []" bölümü atlama?

+1

sadece IPagedResult eğer: IEnumerable

5

Aslında bu öneririm:

return Enumerable.Range(0, count).Select(x => true).ToArray(); 

Bu şekilde yalnızca bir dizi tahsis.

var array = new bool[count]; 

for(var i = 0; i < count; i++) { 
    array[i] = true; 
} 

return array; 
+1

Hatta yeni bool [sayımı

public static void Init<T>(this T[] arr, Func<int, T> factory) { for (int i = 0; i < arr.Length; i++) { arr[i] = factory(i); } } 

Veya fabrika lezzet

] .Select (x => true) .ToArray() – BjartN

+2

Yine de iki diziyi ayırır. –

13

DÜZENLEME: Bir yorumcu belirttiği gibi, benim özgün uygulama işe yaramadı Bu aslında ifade etmek daha özlü bir yoldur. Bu sürüm çalışır, ancak for döngüsüne dayanan oldukça kaygan değildir.

bir uzantısı yöntem yaratmak için istekli iseniz, bu

public static T[] SetAllValues<T>(this T[] array, T value) where T : struct 
{ 
    for (int i = 0; i < array.Length; i++) 
     array[i] = value; 

    return array; 
} 

deneyebilirsiniz ve sonra memnunsanız, bir alternatif olarak bu

bool[] tenTrueBoolsInAnArray = new bool[10].SetAllValues(true); 

gibi çağırmak etrafta asılı bir sınıfa sahip olmak isterseniz, bu gibi bir şeyler deneyebilirsiniz. Genel olarak ben lurv uzatma yöntemleri çok ama çok yapmak rağmen

bool[] tenTrueBoolsInAnArray = ArrayOf<bool>.Create(10, true); 

hangi tercih emin değil gibi çağırabilir. Eğer en hızlı demek 'slickest' tarafından

+0

SetAllValues'inizin çalışacağına inanmıyorum: Lambda ifadenizde x, referans olarak aktarılmamıştır, bu yüzden ona bir değer atamak, dizide saklanan değeri değiştirmez. –

+0

Evet, kesinlikle haklısınız. Aslında bu temel hatayı ortaya çıkaracak olan bir şeyi derlemediğimi söyledim. ForEach 'u basit bir döngü ile değiştirdim ve bu iyi çalışıyor, ancak soru sorucunun istediği kadar kaygan değil. –

+1

Bunun dışında, uzantı yönteminizin yeni bir dizi döndüreceğini ima eden bir imzası vardır, ancak özgün diziyi değiştirir ve bunun yerine döndürür. Kötü form. –

70

, ben Enumerable.Repeat döngü için daha 20x daha yavaş olabilir korkuyorum. http://dotnetperls.com/initialize-array Bkz:

Initialize with for loop: 85 ms [much faster] Initialize with Enumerable.Repeat: 1645 ms 

Yani Dotnetguy en SetAllValues ​​() yöntemini kullanın. Eğer farklı değerlerle farklı hücreleri başlatmak isterdim

+11

+1. – AMissico

1

Birçok kez:

public static T[] GenerateInitializedArray<T>(int size, Func<int, T> factory) 
{ 
    var arr = new T[size]; 
    for (int i = 0; i < arr.Length; i++) 
    { 
     arr[i] = factory(i); 
    } 
    return arr; 
} 
İlgili konular