2009-07-28 1 views
4

Я ищу сверхлегкий способ генерации списка чисел, 1-200. (это может быть List, Array, Enumerable ... Мне действительно не нужен конкретный тип)Простая генерация последовательности?

По-видимому .Net 4.0 имеет метод Sequence.Range(min,max). Но я в настоящее время на .Net 3.5.

Вот пример использования, из того, что мне нужно, показано с помощью Sequence.Range.

public void ShowOutput(Sequence.Range(1,200)); 

На данный момент мне нужны последовательные номера 1-200. В будущих итерациях мне могут понадобиться произвольные списки номеров, поэтому я стараюсь, чтобы дизайн был гибким.

Возможно, есть хорошее решение LINQ? Любые другие идеи?

ответ

13

. NET 3,5 имеет также Range. Это фактически Enumerable.Range и возвращает IEnumerable<int>.

Связанная с вами страница очень устарела - речь идет о 3 как о «будущей версии», а статический класс Enumerable назывался Sequence в один момент до выпуска.

Если вы хотите реализовать его самостоятельно в C# 2 или более поздней версии, это легко - вот один:

IEnumerable<int> Range(int count) 
{ 
    for (int n = 0; n < count; n++) 
     yield return n; 
} 

Вы можете легко писать другие методы, дополнительные списки фильтров:

IEnumerable<int> Double(IEnumerable<int> source) 
{ 
    foreach (int n in source) 
     yield return n * 2; 
} 

Но как у вас есть 3.5, вы можете использовать методы расширения в System.Linq.Enumerable для этого:

var evens = Enumerable.Range(0, someLimit).Select(n => n * 2); 
+0

Вы действительно правильно. Я не читал достаточно внимательно. Спасибо, что поставил меня прямо. – abelenky

+0

На самом деле, вы не указали правильную реализацию. 'Enumerable.Range()' находится в форме 'Range (int start, int count)', поэтому ваш второй параметр должен быть '' count' ', и ваше условие остановки должно быть 'n

+0

Это правда. Я изменил этот пример, чтобы быть немного другим в любом случае (всегда начиная с нуля), так как тогда вы можете использовать 'Select' для добавления смещения к каждому элементу - пример ортогональности. –

3

Отъезд System.Linq.Enumerable.Range.

Что касается второй части вашего вопроса, что вы подразумеваете под «произвольными списками»? Если вы можете определить функцию из int на новые значения, вы можете использовать результат диапазона с другими методами LINQ:

var squares = from i in Enumerable.Range(1, 200) 
       select i * i;