【问题标题】:Read a file to List<int> [closed]将文件读取到 List<int> [关闭]
【发布时间】:2017-05-27 05:39:57
【问题描述】:

我需要从上传的文件中创建一个数字列表,如果数字有“-”代表一个范围,我需要拆分数字,使第一个数字开始,迭代直到它到达第二个数字。我知道我会将数字存储在一个列表中,我只是不确定如何用“-”分隔文件中的数字,这是文件的一个示例:

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

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

【问题讨论】:

    标签: c# wpf csv csvtoarray


    【解决方案1】:

    我假设文件包含的行最多可以有两个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 大小的数组,这可能成为区间的一员。问题是向右打开的间隔永远不会结束,因此请确保明智地执行此操作。

    【讨论】:

      【解决方案2】:

      支持所有错误输入(如字符串和空行)的 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();
      

      【讨论】:

        【解决方案3】:

        我不同意 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);
                    }
                }
        

        【讨论】:

        • 如果一行只有一个整数,你的代码会抛出一个错误。就像问题中的最后一个一样。
        • @Badiparmagi,有if 语句检查行是否包含"-" 符号。如果有此符号,则行将被解析为范围,如果没有,则解析为单个 int。
        • @RomaDoskoch 这个案子怎么样?假设您的范围等于“12345 -”?
        • @Badiparmagi,OP 作者给出了文件内容。没有这样的案例。
        • @RomaDoskoch 所以我们有所有输入空间?这很有趣。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 2015-04-18
        相关资源
        最近更新 更多