将每行具有int值的文件转换为IEnumerable<;int>;
本文关键字:int IEnumerable lt gt 转换 文件 | 更新日期: 2025-02-19 12:14:31
我有一个文件,每行都有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);
}
根据您的描述,我认为与不匹配的行应该引发异常,但我也猜到,您不需要的空行非常常见,所以我会排除这种情况。以适当的方式适应。
如果只想添加可转换为int的行,可以使用int.TryParse。我建议使用File.ReadLines而不是File.ReadAllLines(在内存中创建一个数组):
int value;
IEnumerable<String>lines = File.ReadLines(path)
.Where(l => int.TryParse(l.Trim(), out value));
或者(如果你想选择那些int):
int value;
IEnumerable<int>ints= File.ReadLines(path)
.Where(l => int.TryParse(l.Trim(), out value))
.Select(l => value);