C# 读取要列出的文件

C# 读取要列出的文件,c#,wpf,csv,csvtoarray,C#,Wpf,Csv,Csvtoarray,我需要从上传的文件中创建一个数字列表,如果这些数字有-表示一个范围,我需要分割这些数字,以第一个数字为起点,迭代直到第二个数字。我知道我将把数字存储在一个列表中,我只是不确定如何用-,将文件中的数字分开,下面是该文件的一个示例: 099985-10043 102609-102886 102917-102921 106100-106101 110684-110685 114886-114887 117765-117766 120604-120605 121157-121158 121627-121

我需要从上传的文件中创建一个数字列表,如果这些数字有-表示一个范围,我需要分割这些数字,以第一个数字为起点,迭代直到第二个数字。我知道我将把数字存储在一个列表中,我只是不确定如何用-,将文件中的数字分开,下面是该文件的一个示例:

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...
        }

我非常感谢任何指导和帮助,因为我的编程技能很弱,我正在学习…这不是家庭作业

我不同意Badiparmagi的回答,因为它将字符串/字符添加到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 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循环,从左边缘开始,到右边缘结束,填充一个大小为right-left-1的数组,它可能是区间的一个成员。问题是向右打开的间隔永远不会结束,因此请确保明智地执行此操作。

支持所有错误输入(如字符串和空行)的Linq风格解决方案。例如:

一,

sfd

二,

5-10

11 fdfd

12 13

十四,


如果一行只有一个整数,代码将抛出错误。和问题中的最后一个一样。@Badiparmagi,有一个if语句检查行是否包含-symbol。如果行有此符号,它将被解析为range;如果没有,它将被解析为single int。@RomaDoskoch这种情况如何?假设您的范围等于12345-?@Badiparmagi,OP作者给出了文件内容。没有这样的情况。@RomaDoskoch所以我们都有输入空间?那很有趣。
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();