我正在C#
开发。
我有text file
包含以下内容:
Sam
NYC
Mii
Peru
LEO
Argentina
我想逐行遍历这个文件两行,然后在控制台上打印每对夫妇的first line, second line
(姓名和国家),输出结果为:
Sam, NYC
Mii, Peru
以下是我的尝试:
int linenum = 0;
foreach (string line in File.ReadLines("c:\\file.txt"))
{
string word = line;
string s = "";
string j = "";
linenum = linenum + 1;
if(linenum % 2 != 0) //impaire
{
s = line;
}
else
{
j = line;
}
Console.WriteLine((string.Concat(s, j));
}
但那不起作用,我想这样做:
int linenum = 0;
foreach( two lines in File.ReadLines("c:\\file.txt"))
{
linenum = linenum + 1;
//get the first line (linenum = 1) and store it in a string s
// then get the second line (linenum = 2) and store it in a string j
// then print the two strings together to the console like that
Console.WriteLine((string.Concat("S: " + s,"J: " j));
}
我该怎么做?
答案 0 :(得分:1)
使用File.ReadAllLines
返回字符串数组:
var lines = File.ReadAllLines(filePath);
for (int i = 0; i < lines.Length; i+=2)
{
var s = lines[i];
var j = lines[i+1];
Console.WriteLine($"S: {s} J: {s}");
}
答案 1 :(得分:0)
实际上,你可以使用LIN
一次使用LINQ来获得两行var twoLines = File.ReadLines(@"YourPath").Take(2));
你可以使用Skip跳过你拍摄的两行,然后选择下两行:
var twoLines = File.ReadLines(@"YourPath").Skip(2).Take(2));
编辑:感谢@derpirscher存在性能问题,因此将代码更改为以下内容:
首先读取整个文件并将其存储在字符串数组中 然后使用LINQ循环遍历它,一次从数组中获取两个元素。
string[] myStringArray = File.ReadAllLines(@"YourFile.txt");
for (int i = 0; i < myStringArray.Length ; i+=2)
{
var twoLines = myStringArray.Skip(i).Take(2).ToArray();
}
答案 2 :(得分:0)
您在每行中都使用s
输出,但您也应该只为每一行执行此操作。此外,您的变量j
和int i = 0; string prev = "";
foreach (string line in File.ReadLines("c:\\file.txt")) {
if (i++ % 2 == 0) prev = line;
else Console.WriteLine($"{prev}, {line}");
}
存在于循环的范围内,因此它们会在每次迭代时重新创建并且会丢失它们的先前值。
File.ReadAllLines
另一种方法是使用for
循环而不是foreach
迭代从var lines = File.ReadAllLines("c:\\file.txt");
//make sure, you have an even number of lines!
if (lines.Length% 2 == 0) for (int i = 0; i < lines.Length; i+=2) {
Console.WriteLine($"{lines[i]}, {lines[i+1]}");
}
得到的数组,并将索引增加2
usort($verifications, function($a, $b) {
return $a->getDate()->format('U') - $b->getDate()->format('U');
});
答案 3 :(得分:0)
你可以给自己写一个小帮手方法来返回批量的行。
此实现通过为文件末尾的缺失行返回""
来处理不是批量大小的倍数的文件(在您的情况下为2)。
public static IEnumerable<string[]> BatchedLinesFromFile(string filename, int batchSize)
{
string[] result = Enumerable.Repeat("", batchSize).ToArray();
int count = 0;
foreach (var line in File.ReadLines(filename))
{
result[count++] = line;
if (count != batchSize)
continue;
yield return result;
count = 0;
result = Enumerable.Repeat("", batchSize).ToArray();
}
if (count > 0)
yield return result;
}
请注意,如果您复制了每个结果,这也会为每个结果返回一个单独的数组。
鉴于该代码,您可以像这样使用它:
foreach (var batch in BatchedLinesFromFile(filename, 2))
{
Console.WriteLine(string.Join(", ", batch));
}
答案 4 :(得分:0)
另一个,使用Enumerable.Repeat()和整数选择器增加了[NumberOfLines / 2]
次
LINQ
上瘾可能会很有趣(无论如何,for / foreach
解决方案可能更好。)
string[] input = File.ReadAllLines([SourcePath]);
int Selector = -1;
string[] output = Enumerable.Repeat(0, input.Length / 2).Select(_ => {
Selector += 2;
return $"{input[Selector - 1]} {input[Selector]}";
}).ToArray();
输出结果为:
Sam NYC
Mii Peru
LEO Argentina
答案 5 :(得分:-1)
使用正确的工具完成工作。 foreach()
不是正确的工具。
不放弃ReadLines()的内存效率而不是ReadAll():
using (var lines = File.ReadLines("c:\\file.txt").GetEnumerator())
{
while (lines.MoveNext())
{
string firstLine = lines.Current;
if (!lines.MoveNext())
throw new InvalidOperationException("odd nr of lines");
string secondLine = lines.Current;
// use 2 lines
Console.WriteLine("S: " + firstLine ,"J: " + secondLine);
}
}