C# - Foreach文本文件中的两行

时间:2018-06-14 09:24:17

标签: c# xamarin foreach console-application

我正在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));
 }

我该怎么做?

6 个答案:

答案 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输出,但您也应该只为每一行执行此操作。此外,您的变量jint 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);
        }
    }