Генерация наборов целых чисел в C # - PullRequest
3 голосов
/ 16 декабря 2008

В 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) более читабельно?

Просто ищу мысли. Кто-нибудь еще придумал более элегантное решение?

EDIT: Прочитав ответы, я переписал свой метод To, используя диапазон:

public static int[] To(this int start, int end)
{
    return Enumerable.Range(start, end - start + 1).ToArray();
}

Я все еще ищу мысли о читабельности 1.To (100)

Ответы [ 6 ]

8 голосов
/ 16 декабря 2008

Enumerable.Range (1, 100);

5 голосов
/ 16 декабря 2008

Мне нравится идея использования 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();
0 голосов
/ 16 декабря 2008

Я думаю, вы слишком сильно обеспокоены тем, что язык не совсем точно выражает ту синтаксическую вещь, которая вам нужна.

На мой взгляд, методы расширения - хороший сахар, но мне интересно, действительно ли вы используете его так, чтобы оправдать "удивление" метода расширения.

В области языка C # более подходящим является указание через имя метода того, что вы пытаетесь сделать. Это больше похоже на Ruby, чем на C #. Это больше похоже на то, что он хочет быть в классе сам по себе, особенно если вы хотите добавить диапазоны с пропущенными шаблонами (то есть числа от 1 до 10 по три). Я думаю, что

public class RangedArray {
    public static int[] Generate(int from, into to, int by=1) { /* ... */ }
}

вполне приемлемо выразить это в C #.

0 голосов
/ 16 декабря 2008

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

public static int[] To(this int num)
    {
        //do work
    }
0 голосов
/ 16 декабря 2008

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

Личное мнение, хотя ...

0 голосов
/ 16 декабря 2008

Вы могли бы взглянуть на что-нибудь, связанное с перечислителем и оператором yield?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...