假设这是我的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”)。 谁能让我以正确的方式?
答案 0 :(得分:10)
甚至比Yuck的方法和更短,它不需要一次性将整个文件读入内存:)
var list = File.ReadLines(filename)
.Where((ignored, index) => index % 2 == 1)
.ToList();
不可否认,它确实需要.NET 4.关键部分是overload of Where
,它提供索引以及谓词的值。我们并不真正关心价值(这就是为什么我将参数命名为ignored
) - 我们只想要奇数索引。显然我们关心构建列表时的值,但这很好 - 它只会被谓词忽略。
答案 1 :(得分:7)
您可以将文件读取逻辑简化为一行,并以这种方式遍历每一行:
var lines = File.ReadAllLines(myFile);
for (var i = 1; i < lines.Length; i += 2) {
// do something
}
编辑:从i = 1
开始,在您的示例中为line2
。
答案 2 :(得分: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行,第一行。)如果您已经处理了一行或任何奇数行,请继续处理此当前行(例如行2.)
如果模块化数学会给您带来任何麻烦,请参阅问题:https://stackoverflow.com/a/90247/758446
答案 3 :(得分: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
{
}