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 に変換できる場合にのみ行を追加する場合は、 を使用できます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 に答える