2013-02-16 57 views
0

下面的代码读取一个带有路径标题的文本文件,后跟一个文件名列表。 该代码将每个文件(从第二行开始)添加到ListView。 由于某种原因,最后两行永远不会到达。 有什么建议吗?C#没有通过foreach代码

private void loadFromFile() 
    { 
     if ((faxInOn != null) && File.Exists(@"D:\Settings.ye")) 
     { 
      string[] s; 
      StreamReader sr = new StreamReader(@"D:\Settings.ye", Encoding.Default); 
      s = sr.ReadToEnd().Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None); 
      faxInOn.changePath(s[0]); 
      foreach (string temp in s) 
       foreach (ListViewItem lvi in listView1.Items) 
        if (lvi.Text == temp.Substring(1)) 
         lvi.ImageIndex = int.Parse(temp.Substring(0, 1)); 
      sr.Close(); 
      sr.Dispose(); 
     } 
    } 

感谢

+1

什么最后两行?最后的大括号? sr.Close()和sr.Dispose()??? – scartag 2013-02-16 19:59:26

+0

“最后两行”是什么意思?代码的最后两行,或文本文件的最后两行?此外,请考虑使用'File.ReadAllLines'或'File.ReadLines',这是从文件中获取行的更简单方法。如果您希望使用StreamReader,请使用'using'语句。 – 2013-02-16 19:59:33

+3

方括号是你的朋友。即使你只有一条语句,添加括号可以让你的程序流**更清晰。 – ChrisF 2013-02-16 20:01:25

回答

0

使用File.ReadLines

例如尝试:

// Read all lines in file, skipping the first header line 
foreach(var line in File.ReadLines(@"D:\Settings.ye").Skip(1)) 
{ 
    // add to list view 
} 
+0

工作。谢谢! – 2013-02-16 20:52:35

+0

你应该把它放在try-catch块中。这当然可以抛出一些例外! – saegeoff 2015-02-06 22:13:29

1

在foreach块的使用方式是什么,我认为你正在尝试做真正的效率低下。此外,使用“使用(...)”块将使您的资源得到适当的清理和正确处理,这会让您更轻松,更干净。请参阅:http://msdn.microsoft.com/en-us/library/yh598w02.aspx

+0

我会尝试“for”而不是“foreach”,也许这将是答案。 用代码封装,谢谢。更新:没有运气与“for”而不是“foreach”。 – 2013-02-16 20:19:49

+0

我认为这个foreach是可以使用的,但效率很低。那将是O(n^2)的表现。老实说,因为我认为这些名单很小,所以这可能不是什么大问题。我想上面说的ChrisF是真的。你可能会得到一个异常,但使用应该为你处理。 – saegeoff 2013-02-16 20:31:32