1

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

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

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

谢谢

4

4 回答 4

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();

但是,如果您按照问题中的描述“手动”创建列表,则可能不会有任何可衡量的性能差异。

于 2012-08-31T09:34:12.593 回答
2
var lines = File.ReadLines(path).Where(l => !l.StartsWith("#"));   

你也可以追加.Select(x => int.Parse(x))

于 2012-08-31T09:30:18.073 回答
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 这种情况。在其他情况下酌情适应捕捉。

于 2012-08-31T09:37:49.063 回答
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);  
于 2012-08-31T09:35:23.417 回答