【问题标题】:how to use foreach with an IEnumerable<String> [closed]如何将 foreach 与 IEnumerable<String> 一起使用 [关闭]
【发布时间】:2014-04-04 14:36:28
【问题描述】:
System.Collections.Generic.IEnumerable<String> lines = File.ReadLines("C:\\Rooms.txt");
Console.WriteLine(lines.Count());
MessageBox.Show(lines.Count().ToString());
foreach(var line in lines)
{
    // ERROR ON THIS LINE THE NAMESPACE NAME LINE COULD NOT BE FOUND
}

我想获取行的内容并显示在 MessageBox 中。 但是我在 foreach 上遇到错误

感谢您的帮助。

【问题讨论】:

  • 这只是一个错字 - 你没有给变量一个类型:foreach(string line in lines)
  • foreach (var line in lines)

标签: c# string ienumerable


【解决方案1】:

你需要给循环变量一个类型,所以改变

foreach(line in lines)  

foreach(string line in lines) 

除此之外你会得到另一个异常:

ObjectDisposedException : {"无法从关闭的 TextReader 中读取。"}

File.ReadLines 不返回集合,它类似于StreamReader,它允许读取文件而无需先将所有内容读入内存。但它需要一个开放的流。一旦你“执行”了它,它就会被处理掉。

因此,您要么必须使用返回 string[]File.ReadAllLines,要么不要使用它两次。

  1. Count()
  2. foreach(line in lines)

来自 MSDN:

ReadLinesReadAllLines 方法的区别如下: ReadLines,可以开始枚举之前的字符串集合 整个集合被退回;当您使用 ReadAllLines 时,您必须 等待返回整个字符串数组,然后才能访问 数组。因此,当您处理非常大的文件时, ReadLines 可以更高效。

【讨论】:

    【解决方案2】:

    foreach 要求您指定变量的类型和名称。您只指定了 line,它被用作类型。 var,隐式类型变量,是the suggested convention

    foreach (var line in lines) {
    

    【讨论】:

    • 当变量的类型从赋值的右侧显而易见时,对局部变量使用隐式类型 - lines 可以是任何东西。
    • @RGraham 还有“使用隐式类型来确定 for 和 foreach 循环中循环变量的类型”。以foreach (var ch in laugh) 为例。我认为这意味着“当它很明显时”这一行不适用于for/foreach 变量。在某些情况下,我会同意你的建议,但我认为lines 已经足够明显了。
    • 好点蒂姆,直到我发表评论后我才看到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2016-04-02
    • 2011-06-03
    • 2018-04-06
    • 2013-09-11
    相关资源
    最近更新 更多