2016-03-23 55 views

回答

1

int值不为空。你必须使用负面的。

while((x = Console.Read()) != -1) 
+0

你可以在技术上使用'int?',它是可以为空的。 – Greg

+1

但直到eof才被读取为零 –

+0

@Greg'Console.Read()'返回一个'int' @KingstonJoshua更正。返回的值是-1不是零 –

2

注意,该方法不返回-1,除非你执行 下列操作之一:

  • 同时按下Control修改键和Z键控制台(按Ctrl + Z),这表示文件结束状态。
  • 按下表示文件结束条件的等效键,例如Windows中的F6功能键。
  • 将输入流重定向到具有实际文件结尾字符的源(例如文本文件)。

MSDN Read() method

然后,您可以按字符读取文件,并用简单的数学计算每个分隔值。它很懒,因此不会立即迭代文件以计算所有值。

static void Main(string[] args) 
{ 
    foreach (int i in Read(Console.In)) 
    { 
     Console.WriteLine(i); 
    } 
} 

static IEnumerable<int> Read(TextReader rdr) 
{ 
    int ch; 
    bool neg = false; 
    int value = 0; 
    int count = 0; 

    while ((ch = rdr.Read()) != -1) 
    { 
     if (char.IsWhiteSpace(ch)) 
     { 
      if (count > 0) 
       yield return neg ? -value : value; 
      count = 0; 
      value = 0; 
      neg = false; 
     } 
     else if (count == 0 && ch == '-') 
     { 
      neg = true; 
     } 
     else if (ch >= '0' && ch <= '9') 
     { 
      count++; 
      value = value*10 + (ch - '0'); 
     } 
     else 
      throw new InvalidDataException(); 
    } 

    if (count > 0) 
     yield return neg ? -value : value; 
} 
+1

我想这有点矫枉过正,LOL。 – Andrew

+0

@Andrew它是通用的,因为使用TextReader可以初始化文件和控制台。这是懒惰的,没有像Split方法那样的开销。此外,我不是真正了解源问题,然后我试图添加完全答案。 –