2010-06-12 7 views

cevap

2
var a = Enumerable.Repeat(new MYCLASS(), 10).ToArray(); 
2

Daha kolay bir yol yok. Sadece döngüler beğenmezseniz, size varsayılan kurucu ile inşa Sınıfım türünde 4 unsurlar ile bir dizi verecekti

MyClass[] array = new[] { new MyClass(), new MyClass(), new MyClass(), new MyClass() }; 

kullanabilirsiniz.

Aksi takdirde, yalnızca bir döngü kullanma seçeneğiniz vardır.

static class Extension 
{ 
    public static void ConstructArray<T>(this T[] objArray) where T : new() 
    { 
     for (int i = 0; i < objArray.Length; i++) 
      objArray[i] = new T(); 
    } 
} 

Sonra gibi kullanın: o döngü kullanarak dizi oluşturmak istediğiniz her seferinde yazmak istemiyorsanız

, bir uzantı yöntemi olarak örneğin bir yardımcı-yöntemi oluşturabilirsiniz Bu: Eğer döngü yazmak için istemiyorsanız

MyClass[] array = new MyClass[10]; 
array.ConstructArray(); 
6

yerine Enumerable.Range kullanabilirsiniz:

MyClass[] a = Enumerable.Range(0, 10) 
         .Select(x => new MyClass()) 
         .ToArray(); 

Not: netlik için burada yazılı bir döngü kullanarak söz yöntemle, çok daha yavaş gerçekleşmesine: Sen LINQ kullanabilirsiniz

MyClass[] a = new MyClass[10]; 
for (int i = 0; i < a.Length; ++i) 
{ 
    a[i] = new MyClass(); 
} 
+0

Benchmark'ın bulunduğunu biliyorum: http://dotnetperls.com/initialize-array –

+0

Enumerable.Range (0,10) http:/yerine yeni MYCLASS [10] kullanmak daha iyidir /stackoverflow.com/questions/3028192/how-can-i-create-array-of-my-class-with-default-constructor/3028257#3028257 – Freshblood

1

.

var a = (from x in Enumerable.Range(10) select new MyClass()).ToArray(); 
2

Gerçekten daha iyi bir yol yok. Sen böyle bir şey yapabileceğini: o zaman

public static T[] CreateArray<T>(int len) where T : class, new() { 
    T[] arr = new T[len]; 
    for(int i = 0 ; i <arr.Length ; i++) { arr[i] = new T(); } 
    return arr; 
} 

en azından yalnızca gerekir:

Foo[] data = CreateArray<Foo>(150); 

Bu yaklaşım, en azından herhangi reallocations kaçınmalıdır ve JIT dizisi/uzunluk optimizasyonu kullanabilirsiniz. : class, bu şekilde zaten başlatılan değer türlerinde olduğu gibi, değer türleriyle kullanımdan kaçınmaktır; sadece new MyValueType[200] daha iyi olurdu. biz sadece bir satır kodundaki tüm işi yapmak istiyorsanız

1

yüzden bu bir yapı varsa zaten olduğu gibi, o zaman, her öğeyi başlatmak gerekmez

MYCLASS[] myclass = (new MYCLASS[10]).Select(x => new MYCLASS()).ToArray(); 
+1

İkinci bir cevap vermek yerine cevabınızı güncellemelisiniz. – ChrisF