5

これが私のtxtファイルだとしましょう:

line1
line2
line3
line4
line5

このファイルの内容を次のように読んでいます:

 string line;
List<string> stdList = new List<string>();

StreamReader file = new StreamReader(myfile);
while ((line = file.ReadLine()) != null)
{                
    stdList.Add(line);           
}
finally
{//need help here
}

ここで、stdListのデータを読み取りたいのですが、2行ごとに値のみを読み取ります(この場合、「line2」と「line4」を読み取る必要があります)。誰かが私を正しい方法で置くことができますか?

4

4 に答える 4

10

Yuckのアプローチよりもさらに短く、ファイル全体を一度にメモリに読み込む必要はありません:)

var list = File.ReadLines(filename)
               .Where((ignored, index) => index % 2 == 1)
               .ToList();

確かに、.NET 4 が必要です。重要な部分は、述語が作用するインデックスと値を提供するオーバーロードです。Where値はあまり気にしません (パラメータに という名前を付けたのはそのためですignored) - 奇数のインデックスが必要なだけです。リストを作成するときに値を気にするのは明らかですが、それは問題ありません。述語に対してのみ無視されます。

于 2012-08-01T16:48:19.433 に答える
7

ファイル読み取りロジックを 1 行に単純化して、次のように 1 行おきにループすることができます。

var lines = File.ReadAllLines(myFile);
for (var i = 1; i < lines.Length; i += 2) {
  // do something
}

編集i = 1:あなたの例では、どの時点から始まりline2ます。

于 2012-08-01T16:45:55.657 に答える
5

ループ内に条件付きブロックと追跡メカニズムを追加します。(ループの本体は次のとおりです:)

int linesProcessed = 0;
if( linesProcessed % 2 == 1 ){
  // Read the line.
  stdList.Add(line);
}
else{
  // Don't read the line (Do nothing.)
}
linesProcessed++;

この行linesProcessed % 2 == 1は次のように述べています: すでに処理した行数を取得し、mod 2この数の を見つけます。(その整数を 2 で割った余り。)これにより、処理された行数が偶数か奇数かがチェックされます。

行を処理していない場合は、スキップされます (行 1、最初の行など)。1 行または奇数行を既に処理している場合は、この現在の行 (行 2 など) を処理します。

モジュラ演算で問題が発生した場合は、質問を参照してください: https://stackoverflow.com/a/90247/758446

于 2012-08-01T16:45:55.217 に答える
0

これを試して:

string line;
List<string> stdList = new List<string>();

StreamReader file = new StreamReader(myfile);
while ((line = file.ReadLine()) != null)
{
    stdList.Add(line);
    var trash = file.ReadLine();  //this advances to the next line, and doesn't do anything with the result
}
finally
{
}
于 2012-08-01T16:46:52.287 に答える