10

我有未知数量的输入行。我知道每一行都是一个整数,我需要用所有行创建一个数组,例如:

输入:

12
1
3
4
5

我需要把它作为一个数组:{12,1,3,4,5}

我有下面的代码,但我无法获取所有行,也无法调试代码,因为我需要发送它来测试它。

List<int> input = new List<int>();

string line;
while ((line = Console.ReadLine()) != null) {
     input.Add(int.Parse(Console.In.ReadLine()));
}

StockItem[] stock = new StockItem[input.Count];
for (int i = 0; i < stock.Length; i++) {
    stock[i] = new StockItem(input.ElementAt(i));
}
4

3 回答 3

18
List<int> input = new List<int>();

// As long as there are nonempty items read the input
// then add the item to the list    
string line;
while ((line = Console.ReadLine()) != null && line != "") {
     input.Add(int.Parse(line));
}

// To access the list elements simply use the operator [], instead of ElementAt:
StockItem[] stock = new StockItem[input.Count];
for (int i = 0; i < stock.Length; i++) {
    stock[i] = new StockItem(input[i]);
}
于 2012-04-29T22:12:19.667 回答
2

你真的需要数组中的ID吗?我可能会尝试这样的事情:

    // Use a function that takes a StringReader as an input.
    // That way you can supply test data without using the Console class.
    static StockItem[] ReadItems(StringReader input)
    {
      var stock = new List<StockItem>();

      // Only call ReadLine once per iteration of the loop.
      // I expect this is why you're not getting all the data.
      string line = input.ReadLine();
      while( ! string.IsNullOrEmpty(line) ) {

        int id;
        // Use int.TryParse so you can deal with bad data.
        if( int.TryParse(line, out id) ) { 
          stock.Add(new Stock(id));
        }

        line = input.ReadLine();
      }

      // No need to build an populate an array yourself. 
      // There's a linq function for that.
      return stock.ToArray();
    }

然后你可以调用它

  var stock = ReadItems(Console.In);
于 2012-04-29T22:25:53.147 回答
0

使用列表是一个好方法。但是您应该考虑限制总行数。

此外,OP没有说空行应该终止列表!

所以应该只检查 null 。

请参阅如何在 C# 中的控制台上检测 EOF?Console.ReadLine() 在 EOF 时返回什么?

于 2018-05-30T18:22:03.230 回答