2010-11-06 2 views
13

Я хотел бы создать C#целых чисел, от 1930 до 2010 года. С моей точки зрения, единственный способ, которым я могу это сделать, - использовать for или while цикл для циклического преобразования каждого целого числа между числами и их индивидуального добавления в List.C#: Build Список лет как целые числа

Я знаю, что в списках C# есть много интересных методов, особенно если вы используете Linq. Может ли кто-нибудь подумать об более эффективном способе этого?

+0

Можете ли вы объяснить немного больше, почему вы создаете эти годы? поэтому мы можем дать лучшие предложения. –

+0

Использование цикла while \ for будет эффективным. Повторное использование результата, скорее всего, будет более важным с точки зрения эффективности, а не с его созданием. –

+0

@chibacity, я строю значения для использования в выпадающем списке выбора в HTML, поэтому, вероятно, не стоит беспокоиться о том, как будет использоваться List. –

ответ

33

Enumerable.Range(1930, 81) (MSDN docs) предоставит вам перечислимое, содержащее то, что вы хотите. Первым параметром является начальное значение, а второе - количество элементов. Вам нужно 81 вместо 80, потому что вы хотите от 1930 до 2010 года включительно.

Если вы явно хотите использовать его как List, используйте Enumerable.Range(1930, 81).ToList().

Этот метод, вероятно, не отличается по эффективности, но является более кратким кодом.

+1

+1. Это лучше документирует намерение, более декларативное, чем императивное, и менее склонно к зависаниям, например, к случайным изменениям переменных цикла. В стороне: мне жаль, что существует функция, подобная диапазону, которая принимала нижнюю и верхнюю границы, а не нижнюю границу и количество. Не уверен, что бы вы назвали, или как справиться с инклюзивной/исключительной проблемой именования/использования, tho :) –

+0

@Merlyn: да, я согласен. Что-то похожее на синтаксис F # [1930..2010] было бы неплохо. – adrianbanks

7

Использование Enumerable.Range()

var MyList = Enumerable.Range(1930, 2010-1930+1).ToList(); 
+1

Не могу я просто сделать новый список (Enumerable.Range (1930, 2010-1930 + 1)) 'и избежать цикла? –

+0

@Mega Matt: да. Я просто понял, что мой мозг развалился. –

+0

@Mega: Какой цикл? Любой цикл в его коде будет существовать и в вашем коде (копирование перечислимого в список). –

3

Два других правильные ответы, используя Enumberable.Range() это быстрый/простой способ сделать это, но я хотел бы добавить на куске. Используйте DateTime.Now.Year, поэтому вам не нужно исправлять код каждый год. Через два месяца использование жестко закодированного значения для второго параметра сделало бы это устаревшим.

List<int> listYears = Enumerable.Range(1930, DateTime.Now.Year - 1930 + 1).ToList(); 
1

Таким образом, в то время как это был дан ответ (с хорошими ответами), почему бы не создать Способы, которые «дает» (a generator method) - Enumerable.Range именно такой метод, который является стандартным:

IEnumerable<int> InclusiveRange(int s, int e) { 
    for (int i = s; i <= e; i++) { 
    yield return i; 
    } 
} 

var r = InclusiveRange(1930, 2010).ToList(); 

Счастливое кодирование.

+0

Я бы объединил его с ** jb. ** answer: 'var r = InclusiveRange (1930, DateTime.Now.Year - 1930 + 1) .ToList();' :) – Noctis

+0

@Noctis Нет необходимости вычитать начало год; просто 'var r = InclusiveRange (1930, DateTime.Now.Year) .ToList();' – Stajs

Смежные вопросы