读取一个文件到 List<int>
Read a file to 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...
}
我非常感谢任何指导和帮助,因为我的编程技能很弱而且我正在学习...这不是家庭作业
我不同意 Badiparmagi 的回答,因为它将 string/character 添加到 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();
我需要从上传的文件创建一个数字列表,如果数字有“-”代表一个范围,我需要拆分数字,使第一个数字开始,遍历直到它到达第二个数字。我知道我会将数字存储在列表中,我只是不确定如何用“-”分隔文件中的数字,这是文件示例:
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 的回答,因为它将 string/character 添加到 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();