我在每一行都有一个包含 int 值的文件(尽管某些值可能不像某些注释那样是 int)。但是文件的结构是:
1
2
3
4
5
6
7
#some comment
9
10
etc...
将其转换为 IEnumerable 的最快方法是什么?我可以逐行阅读并使用 List 并调用 Add 方法,但我想它在性能方面并不是最好的。
谢谢
您可以IEnumerable
在读取文件时即时创建:
IEnumerable<Int32> GetInts(string filename)
{
int tmp = 0;
foreach(string line in File.ReadLines(filename))
if (Int32.TryParse(line, out tmp))
yield return tmp;
}
这样,您可以在读取文件时使用foreach
循环对整数执行任何操作。
foreach(int i in GetInts(@"yourfile"))
{
... do something with i ...
}
如果您只想创建一个列表,只需使用ToList
扩展名:
List<Int32> myInts = GetInts(@"yourfile").ToList();
但是,如果您按照问题中的描述“手动”创建列表,则可能不会有任何可衡量的性能差异。
var lines = File.ReadLines(path).Where(l => !l.StartsWith("#"));
你也可以追加.Select(x => int.Parse(x))
public static IEnumerable<int> ReadInts(TextReader tr)
{
//put using here to have this manage cleanup, but in calling method
//is probably better
for(string line = tr.ReadLine(); line != null; line = tr.ReadLine())
if(line.Length != 0 && line[0] != '#')
yield return int.Parse(line);
}
我从您的描述中假设不匹配的行应该引发异常,但我也猜想您不想要它们的空白行很常见,所以我做 cathc 这种情况。在其他情况下酌情适应捕捉。
如果您只想添加可转换为整数的行,则可以使用int.TryParse
. 我建议使用File.ReadLines
而不是File.ReadAllLines
(在内存中创建一个数组):
int value;
IEnumerable<String>lines = File.ReadLines(path)
.Where(l => int.TryParse(l.Trim(), out value));
或(如果您想选择这些整数):
int value;
IEnumerable<int>ints= File.ReadLines(path)
.Where(l => int.TryParse(l.Trim(), out value))
.Select(l => value);