Генерация наборов целых чисел в C#

В 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)

У вас есть особая потребность в создании массива, а не IEnumerable <int>? Если это так, мне любопытно, каковы ваши причины для этого требования.

joshperry 16.04.2010 00:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
1 383
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Enumerable.Range (1, 100);

Этот метод полезен. Спасибо. Он менее читабелен, чем 1.To (100), но я могу использовать его в реализации, по крайней мере, To ().

Brian Genisio 16.12.2008 16:09

Я должен подробнее рассказать, почему я считаю его менее читаемым ... это потому, что мне действительно нужен массив, который становится: Enumerable.Range (1, 100) .ToArray ()

Brian Genisio 16.12.2008 16:12

Я бы сказал, что 1.To (100) может быть неправильно понято. Для меня это звучит как актерский состав. Преимущество Enumerable.Range заключается в том, что он реализован в среде .net, и поэтому он, вероятно, знаком большему количеству людей.

terjetyl 16.12.2008 16:42

И это то, что я ищу. Я действительно не хочу писать Enumerable.Range (5, 2) .ToArray () для обозначения new [] {5,6,7}. Я понимаю, что 5.To (7) может сбивать с толку, но он читается лучше, чем строка Enumerable. Я ищу предложения, которые более читабельны, чем 5.To (7)

Brian Genisio 16.12.2008 16:59

Добавление методов расширения к чему-то вроде int заставляет меня чувствовать себя немного неприятно.

Benjol 18.06.2009 15:41

Я думаю, что что-то вроде Set(1,100) или IntSequence(1,100) легче читать, чем использовать метод расширения.

Хотя личное мнение ...

Я бы избегал "Set", потому что он означает wrt: properties, и я бы предпочел видеть Sequence <int>, чем IntSequence

annakata 16.12.2008 16:16

Мне нравится идея использовать 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

Brian Genisio 16.12.2008 16:28

Вы можете это сделать, но вы действительно пожертвовали удобочитаемостью, когда набор сгенерирован ...

Brian Genisio 16.12.2008 16:35

Спасибо за комментарии. Я перечитал OP и понял, что написал именно то, что вы написали ... Извините за это. :-)

Christoffer Lette 16.12.2008 16:37

Это умное использование методов расширения.

BobbyShaftoe 16.12.2008 16:45

Ваш ответ на ваш собственный вопрос в порядке. Просто не используйте список, если вас беспокоит производительность. Глупо составлять список и постоянно его расширять. Просто создайте массив подходящего размера. Используйте метод расширения

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)

TheSoftwareJedi 17.12.2008 02:56

Другие вопросы по теме