2010-01-09 4 views

ответ

5

, как вы делаете это нормально:

PostType[] q = new PostType[qArray.Length]; 
for (int i = 0; i < q.Length; i++) 
    q[i] = new PostType(); 

Одна вещь, которую я Изменились переименовать индекс veriable от х к I, так как я считаю, это легче читать, хотя это субъективная вещь.

Другое, что я изменил, это условие конца цикла для цикла должно зависеть от длины q, а не от длины qArray. Причина этого заключается в том, что с помощью вашего метода, если вы решите изменить первую строку, чтобы использовать другую длину вместо qArray.Length, вам придется не забывать также менять вторую строку. С измененным кодом вам нужно только обновить первую строку кода, а остальная часть будет работать без изменений.

Вы также мог бы сделать это с помощью Linq:

PostType[] q = Enumerable.Range(0, qArray.Length) 
         .Select(_ => new PostType()) 
         .ToArray(); 

Но для больших массивов это будет медленнее, и на самом деле не легче читать на моем взгляде (особенно, если вы еще не видели его раньше). Думаю, я бы, наверное, придерживался первого метода, если бы я был вами.

+0

перечислимых Repeat не будет работать, как он повторяет ссылку на первый объект, а не создавать новые – Aly

+0

Enumerable.Range работы (он создает новый объект для каждого вызова). Но я бы посоветовал ни Repeat, ни Range - как для удобочитаемости, так и для производительности. Я обновил свой комментарий с помощью явного примера и объяснил, почему я думаю, что вы не должны его использовать. –

1

На самом деле нет лучшего способа сделать это. Обратитесь к http://dotnetperls.com/initialize-array
Есть несколько других методов, но простой цикл быстрее

существенный
2

Там нет лучшего способа, если PostType класс: вам необходимо посетить каждую позицию в массиве и установите его.

Если PostType - это структура, то вам не нужно ничего делать: каждая позиция в массиве автоматически инициализируется значением по умолчанию для структуры (все поля 0). (Но если вы хотите использовать конструктор nondefault, тогда вы вернетесь к той же позиции, что и к классам, - вам нужно будет посетить каждую позицию и явно вызвать конструктор unefefault.)

0

Не то, чтобы я мог думать выкл, когда вы создаете память массива, находится для него, за исключением того, что каждый индекс указывает на нуль. Лучший способ сделать ваш код более эффективным будет хранить qArray.Length в переменную, так что вы не называйте .length на каждой итерации цикла т.е.

int a = qLength 
    for(int x = 0; x < qLength; x++) 
     q[x] = new PostType(); 

Примечание: перечислимых Repeat не будет работать, поскольку он создает один экземпляр объекта, а затем повторяет ссылку на этот объект.

2

Кусок торта. Почему бы не сделать что-то подобное. Это лаконично.

PostType[] q = qArray.Select(i => new PostType()).ToArray(); 
1

У меня есть хорошая идея, элегантный способ инициализации настраиваемого типа массивов.

Сначала вы должны объявить статический метод для выполнения этих заданий в классе PostType или в новом классе.

public class PostType 
{ 
    public static T[] extent<T>(int n) 
    { 
     T[] result = new T[n]; 

     if (!typeof(T).IsValueType) 
     { 
      Type type = typeof(T); 
      object objTSource = Activator.CreateInstance(type); 

      for (int i = 0; i < n; i++) 
      { 
       result[i] = (T)objTSource; 
      } 
     } 

     return result; 
    } 
} 

Наконец, это элегантный способ:

PostType[] q = PostType.extent<PostType>(qArray.Length); 
Смежные вопросы