各行に 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);
}
あなたの説明から、一致しない行は例外をスローする必要があると思いますが、必要のない空白行は非常に一般的であると推測したので、その場合はcathcします。それ以外の場合は、必要に応じてそれをキャッチするように調整します。
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);