Разобрать строку, содержащую целые числа, в Список <int> - PullRequest
1 голос
/ 22 сентября 2011

Я хочу разрешить пользователю вводить целые числа следующими способами:

  • Числа, разделенные запятыми: 1,3,122,64000,27 и т. Д.

  • Диапазоны чисел: 37-2000

  • Смесь перечисленного: 55,2,1-10000,65000-65007,2182

Как я могу разобрать строку, которая может быть в любой из вышеперечисленных форм, и в итоге получить список типа int?

Так, например: 1-5,6,7-8 должен дать списоксодержащий целые числа 1,2,3,4,5,6,7,8

Я довольно новичок в C #, поэтому некоторые примеры кода будут с благодарностью.Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Это работает:

var query =
    from x in text.Split(',')
    let y = x.Split('-')
    let b = int.Parse(y[0].Trim())
    let e = int.Parse(y[y.Length - 1].Trim())
    from n in Enumerable.Range(b, e - b + 1)
    select n;

var result = query.ToList();

Я бы предложил добавить обработку ошибок, но если ваш ввод в правильном формате, это работает.


** EDIT **: версия .NET 2.0.

var result = new List<int>();
foreach (var x in text.Split(','))
{
    var y = x.Split('-');
    var b = int.Parse(y[0].Trim());
    var e = int.Parse(y[y.Length - 1].Trim());
    for (var n = b; n <= e; n++)
    {
        result.Add(n);
    }
}

То же самое ...: -)

2 голосов
/ 22 сентября 2011

String.split разбиение запятой, даст вам все, что вам нужно, тогда, если группа содержит - разделить его снова, и у вас есть два значения диапазона

0 голосов
/ 22 сентября 2011

Маркируйте строку на основе ',', затем анализируйте этот список отдельных чисел или диапазонов.

Из памяти есть метод Split (..) в List, который вы можете использовать для получения токенов.Затем просто проверьте наличие «-» (если это первый символ, то отрицательный, а не диапазон).

...