В F# вы можете сгенерировать набор чисел, просто произнеся [1..100].
Я хочу сделать что-то подобное на C#. Вот что я до сих пор придумал:
public static int[] To(this int start, int end)
{
var result = new List<int>();
for(int i = start; i <= end; i++)
result.Add(i);
return result.ToArray();
}
Сделав это, я теперь могу создать набор, сказав 1.To (100)
К сожалению, это не так удобно, как [1..100]. Кто-нибудь придумал лучший способ сделать это на C#? Будет ли он более читаемым, если он будет строчными? 1. к (100), например? Или «К» - плохое слово? Что-то вроде 1.Through (100) более читабельно?
Просто ищу какие-то мысли. Кто-нибудь еще придумал более элегантное решение?
Обновлено: Прочитав ответы, я переписал свой метод To, используя диапазон:
public static int[] To(this int start, int end)
{
return Enumerable.Range(start, end - start + 1).ToArray();
}
Еще ищу мысли по читабельности 1. до (100)





Enumerable.Range (1, 100);
Этот метод полезен. Спасибо. Он менее читабелен, чем 1.To (100), но я могу использовать его в реализации, по крайней мере, To ().
Я должен подробнее рассказать, почему я считаю его менее читаемым ... это потому, что мне действительно нужен массив, который становится: Enumerable.Range (1, 100) .ToArray ()
Я бы сказал, что 1.To (100) может быть неправильно понято. Для меня это звучит как актерский состав. Преимущество Enumerable.Range заключается в том, что он реализован в среде .net, и поэтому он, вероятно, знаком большему количеству людей.
И это то, что я ищу. Я действительно не хочу писать Enumerable.Range (5, 2) .ToArray () для обозначения new [] {5,6,7}. Я понимаю, что 5.To (7) может сбивать с толку, но он читается лучше, чем строка Enumerable. Я ищу предложения, которые более читабельны, чем 5.To (7)
Добавление методов расширения к чему-то вроде int заставляет меня чувствовать себя немного неприятно.
Я думаю, что что-то вроде Set(1,100) или IntSequence(1,100) легче читать, чем использовать метод расширения.
Хотя личное мнение ...
Я бы избегал "Set", потому что он означает wrt: properties, и я бы предпочел видеть Sequence <int>, чем IntSequence
Мне нравится идея использовать To. Альтернативный Enumerable.Range имеет небольшой недостаток imo. Второй параметр - это нет, значение последнего элемента, это длина перечисления. Вот что я делал раньше:
public IEnumerable<int> To(this int start, int stop)
{
while (start <= stop)
yield return start++;
}
Обновлено: Если вы хотите получить результат как int[], просто добавьте .ToArray():
int[] theSet = 1.To(100).ToArray();
Да, хорошее дело в длине, а не в оценке тонкости. Мне нужно, чтобы это был массив, а не IEnumerable, поэтому yield здесь не приносит мне никакой пользы. Смотрите мои правки в OP
Вы можете это сделать, но вы действительно пожертвовали удобочитаемостью, когда набор сгенерирован ...
Спасибо за комментарии. Я перечитал OP и понял, что написал именно то, что вы написали ... Извините за это. :-)
Это умное использование методов расширения.
Ваш ответ на ваш собственный вопрос в порядке. Просто не используйте список, если вас беспокоит производительность. Глупо составлять список и постоянно его расширять. Просто создайте массив подходящего размера. Используйте метод расширения
public static int[] To(this int num)
{
//do work
}
Я думаю, вы слишком беспокоитесь о том, что язык не совсем точно выражает ту синтаксическую вещь, которую вы хотите.
На мой взгляд, методы расширения - это приятный сахар, но мне интересно, действительно ли вы используете их так часто, чтобы оправдать «неожиданность» метода расширения.
В рамках языка C# более уместно указывать через имя метода то, что вы пытаетесь сделать. Это больше похоже на Ruby, чем на C#. Это больше похоже на то, что он хочет быть в классе сам по себе, особенно если вы хотите добавить диапазоны с шаблонами пропуска (т. Е. Числа от 1 до 10 по тройкам). я думаю что
public class RangedArray {
public static int[] Generate(int from, into to, int by=1) { /* ... */ }
}
вполне приемлемо, чтобы выразить это на C#.
Я согласен. Тем не менее, ваш параметр по умолчанию - C# 4 ... это сбивает с толку некоторых прямо сейчас (pre rtm)
У вас есть особая потребность в создании массива, а не IEnumerable <int>? Если это так, мне любопытно, каковы ваши причины для этого требования.