Прочитать файл в List<int>

Мне нужно создать список чисел из загруженного файла, если у чисел есть "-", представляющий диапазон, мне нужно разделить числа, сделав первое число начальным, итеративно, пока оно не дойдет до второго числа. Я знаю, что я буду хранить числа в списке, я просто не уверен, как разбить числа в файле с помощью "-", вот пример файла:

099985-10043

102609-102886

102917-102921

106100-106101

110684-110685

114886-114887

117765-117766

120604-120605

121157-121158

121627-121911

122539

и вот где я с кодом:

 if(string.IsNullOrEmpty(fileName.Text)) return;
        _MissingInt = new List<int>();
        var lines = File.ReadAllLines(fileName.Text);
        foreach (string line in lines) {
            ...need help with logic...
        }

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

3 ответа

Решение

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

if (string.IsNullOrEmpty(fileName.Text)) return;
        var _MissingInt = new List<int>();
        var lines = File.ReadAllLines(fileName.Text);
        foreach (var line in lines)
        {
            if(string.IsNullOrEmpty(line)) 
                continue;
            if (line.Contains("-"))
            {
                var range = line.Split('-');
                int startNumber;
                int endNumber;
                if(int.TryParse(range[0], out startNumber) && int.TryParse(range[1]), out endNumber)
                   for (var i = startNumber; i < endNumber; i++)
                   {
                       _MissingInt.Add(i);
                   }
            }
            else
            {
                 int num;
                 if(int.TryParse(line, out num))
                    _MissingInt.Add(num);
            }
        }

Я предполагаю, что файл содержит строки, которые могут иметь два int максимальные значения, разделенные -, Давайте предположим, что у нас есть class как это:

class Interval {
    public int left;
    public int right;
    public bool hasRight;

    public Interval(int left, int right) {
        this.left = left;
        this.right = right;
        hasRight = true;
    }

    public Interval(int left) {
        this.left = left;
        hasRight = false;
    }
}

Теперь давайте реализуем метод парсера:

protected Interval parse(String line) {
    String[] parts = line.Split(new string[] {"-"});
    int left, right;
    if (!Int32.TryParse(parts[0], left)) {
        return null; //Invalid interval
    }
    return ((parts.length <= 1) || (!Int32.TryParse(parts[1], right))) ? (new Interval(left)) : (new Interval(left, right));
}

И другой:

protected Interval[] aggregateParse(String[] lines) {
    Interval[] intervals = new Interval[lines.Length];
    for (int i = 0; i < lines.Length; i++) {
        intervals[i] = parse(lines[i]);
    }
    return intervals;
}

Это может быть использовано для генерации интервалов. Если нам нужно получить целые числа между краями интервала и сохранить их, то мы можем использовать цикл for, начиная с левого края и заканчивая у правого края, заполняя массив размером вправо - влево - 1, который может быть участником интервала. Проблема в том, что интервал, который открывается справа, никогда не закончится, поэтому убедитесь, что вы делаете это с умом.

Решение в стиле Linq, которое поддерживает все неправильные данные, такие как строки и пустые строки. Например:

1

SFD

2

5-10

11-fdfd

12 13

14

int x;

var res = lines
    // filter out empty lines
    .Where(line => !string.IsNullOrEmpty(line))
    // convert ranges to pairs
    .Select(line => line.Split('-'))
    // filter out not numbers
    .Where(line => line.All(number => int.TryParse(number, out x)))
    // convert all strings to int
    .Select(item => item.Select(int.Parse).ToList())
    .SelectMany(item =>
    {
        if (item.Count > 1)
        {
            return Enumerable.Range(item[0], item[1] - item[0] + 1);
        }

        return item;
    })
    .ToList();
Другие вопросы по тегам