我编写了一个函数来通过搜索文本找到该行,在找到该特定行之后,我想读取下一行并返回该文本。功能如下:
public static string NextString(string textfind)
{
List<string> found = new List<string>();
string linejd;
using (StreamReader efile = new StreamReader(FILENAME))
{
int counter = 0;
while ((linejd = efile.ReadLine()) != null)
{
counter++;
if (linejd.Contains(textfind))
{
found.Add(linejd);
string nextstring = efile.ReadLine();
return nextstring;
}
}
}
}
文件名已定义为:
const string FILENAME = @"E:\model\Yen and Lee\AQRun01\eratc.inp";
然而,我一直在收到错误:
AQ.Program.NextString(string)':并非所有代码路径都返回值
答案 0 :(得分:2)
如果在上面的函数中,您的代码没有进入循环或if (linejd.Contains(textfind))
块,该怎么办?该函数不返回任何值!
我倾向于建议声明一个函数的结果变量并在函数中设置它的值,然后在结尾处返回它:
static public string nextstring(string textfind)
{
string result = string.Empty;
List<string> found = new List<string>();
string linejd;
/* ********************************************************
* Find the line with certain string */
using (StreamReader efile = new StreamReader(FILENAME))
// using (efile)
{
int counter = 0;
while ((linejd = efile.ReadLine()) != null
&& string.IsNullOrWhiteSpace(result)) // Quit the loop once we have a result!
{
counter++;
if (linejd.Contains(textfind))
{
found.Add(linejd);
string nextstring = efile.ReadLine();
result = nextstring; }
}
}
return result;
}
答案 1 :(得分:1)
如果条件linejd.Contains(textfind)
永远不为真,那么函数将永远不会返回任何内容,但函数声明表明它将返回一个字符串。您可以通过在using块之后返回默认值(例如空字符串)来解决此问题。
答案 2 :(得分:1)
有两个原因导致函数在没有返回值的情况下退出:
while
循环。linejd.Contains(textfind)
永远不会是true
。即使您知道文件永远不会为空,并且文件中始终可以找到该字符串,编译器也不知道。 (虽然如果您知道始终可以找到该字符串,while
循环没有意义,因为这意味着您永远不会到达文件的末尾。)
您需要告诉编译器如何处理这两种情况,例如在函数末尾添加return null;
。
或者重写代码,使其实际依赖于始终包含某些内容的文件,并始终找到该字符串。这样就没有松散的目的可以照顾。这当然意味着如果文件实际上是空的或者找不到字符串,代码将崩溃或挂起。
答案 3 :(得分:1)
如何使用Linq?
public static string NextString(string textfind)
{
return File.ReadLines(FILENAME)
.SkipWhile(line => !line.Contains(textfind))
.Skip(1)
.First();
}
答案 4 :(得分:0)
当if case总是出错时,那么你的方法将什么也不返回..这就是你得到错误的原因。 尝试在方法结束之前写一个返回值,如:
public static string NextString(string textfind)
{
List<string> found = new List<string>();
string linejd;
string new_string = string.Empty;
using (StreamReader efile = new StreamReader(FILENAME))
{
int counter = 0;
while ((linejd = efile.ReadLine()) != null)
{
counter++;
if (linejd.Contains(textfind))
{
found.Add(linejd);
string nextstring = efile.ReadLine();
return nextstring;
}
}
}
return (new_string);
}