我在每行中都有一个带有int值的文件(尽管有些值可能不是像某些注释那样的整数)。但文件的结构是:
1
2
3
4
5
6
7
#some comment
9
10
etc...
将它转换为IEnumerable的最快方法是什么。我可以逐行阅读并使用List并调用Add方法,但我认为它在性能方面并不是最好的。
由于
答案 0 :(得分:4)
您可以在阅读文件时即时创建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();
但如果您按照问题中的描述“手动”创建列表,则可能不存在任何可衡量的性能差异。
答案 1 :(得分:2)
var lines = File.ReadLines(path).Where(l => !l.StartsWith("#"));
您还可以附加.Select(x => int.Parse(x))
答案 2 :(得分:1)
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那种情况。适应以适当的方式捕获它。
答案 3 :(得分:0)
如果只想在可转换为整数时添加行,则可以使用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);