代码的目的是在一长串字符串(另一个文档)中查找字符串的一部分(来自一个文档),并将结果返回到列表。
我有两个while循环,一个嵌套在另一个循环中。外部循环读取该文档的每一行,内部读取其文档的每个循环。由于某种原因,内部只运行一次(对于外部循环的第一次迭代)。你能解释一下为什么以及如何解决这个问题?它似乎只读取所有行一次,然后再不读它们......每次外循环运行时,我都需要内循环逐行读取。
这是我的代码。
private static void getGUIDAndType()
{
try
{
Console.WriteLine("Begin.");
String dbFilePath = @"C:\WindowsApps\CRM\crm_interface\data\";
StreamReader dbsr = new StreamReader(dbFilePath + "newdbcontents.txt");
List<string> dblines = new List<string>();
String newDataPath = @"C:\WindowsApps\CRM\crm_interface\data\";
StreamReader nsr = new StreamReader(newDataPath + "HolidayList1.txt");
List<string> new1 = new List<string>();
string dbline;
string newline;
Program prog = new Program();
while ((dbline = dbsr.ReadLine()) != null)
{
while ((newline = nsr.ReadLine()) != null)
{
newline = newline.Trim();
if (dbline.IndexOf(newline) != -1)
{//if found... get all info for now
Console.WriteLine("FOUND: " + newline);
System.Threading.Thread.Sleep(1000);
new1.Add(newline);
}
else
{//the first line of db does not contain this line...
//go to next newline.
Console.WriteLine("Lines do not match - continuing");
continue;
}
}
nsr.Close();
Console.WriteLine("should be run as many times as there are dblines");
Console.WriteLine(newline);
System.Threading.Thread.Sleep(5000);
//continue;
}
Console.WriteLine("Writing to dbc2.txt");
System.IO.File.WriteAllLines(@"C:\WindowsApps\CRM\crm_interface\data\dbc2.txt", new1.ToArray());
Console.WriteLine("Finished. Press ENTER to continue.");
Console.WriteLine("End.");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex);
Console.ReadLine();
}
}
我尝试将内部循环设置为方法,但是当我在方法中引用dbline时,我在此行获取对象引用异常:
if (dbline.IndexOf(newline) != -1)
。是不是真的花了很多时间来修复它并回到嵌套循环;但如果我采用这种方法,我认为我的结果不会有任何不同。
如果您能想出更好的方法来做我想做的事,请告诉我。我不能使用contains,因为我引用的两个txt文档中的行不完全相同。
感谢。
答案 0 :(得分:3)
您的内循环使用该文件。回到开头。
答案 1 :(得分:3)
对于外循环的每次迭代,您需要将内循环的StreamReader
倒回到文件的开头:
while ((dbline = dbsr.ReadLine()) != null)
{
// Reset
nsr.BaseStream.Position = 0;
nsr.DiscardBufferedData();
while ((newline = nsr.ReadLine()) != null)
{
.....
}
nsr.Close(); // remove that
根据评论编辑:
你还需要在内循环之后删除StreamReader的Close(),在外循环之后移动它。
答案 2 :(得分:1)
由于while
循环在没有break
或return
语句的情况下终止,这意味着此循环条件正在评估为false:
(newline = nsr.ReadLine()) != null
也就是说,nsr.Readline()
正在返回null
,因为您已经命中了文件结尾。
如果你真的打算从nsr
多次读取行,你可以通过重置基础Stream
上的位置并丢弃StreamReader
的缓冲区来寻找开头:
nsr.BaseStream.Position = 0;
nsr.DiscardBufferedData();