将每行中带有int值的文件转换为IEnumerable <int> </int>

时间:2012-08-31 09:28:24

标签: c# .net file-io

我在每行中都有一个带有int值的文件(尽管有些值可能不是像某些注释那样的整数)。但文件的结构是:

1
2
3
4
5
6
7
#some comment
9
10
etc...

将它转换为IEnumerable的最快方法是什么。我可以逐行阅读并使用List并调用Add方法,但我认为它在性能方面并不是最好的。

由于

4 个答案:

答案 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);