我正在尝试使用streamreader进行简单的实时搜索,从txt文件中读取并在listview中搜索并显示结果,问题是我只能搜索1个字母,因此搜索“1”将显示我的结果以1开头,示例搜索1结果为“123”,但搜索“12”或“123”不会显示相同的结果。用我已经尝试过的代码更容易解释。
编辑,我正在阅读的文本文件具有以下结构: 123; asd; asd; asd; asd; asd; asd< - 行的例子
public static string[] testtt(string sökord)
{
StreamReader asd = new StreamReader("film.txt");
string temp;
string[] xd;
while (asd.Peek() >= 0) // if I can read another row (I.E next row isnt empty)
{
temp = asd.ReadLine();
xd = temp.Split(';');
for (int i = 0; i < xd.Length; i++)
{
// this should check if my searchword is equal to any member of "xd"
// but this is where the problem occurs when the input is more than 1
// character, will post error message from debugger below this code.
if (xd[i].Substring(0, sökord.Length).ToLower() == sökord.ToLower())
return xd;
}
}
return null;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
try
{
listView1.Items.Clear();
ListViewItem item = new ListViewItem(testtt(textBox1.Text)[0]);
item.SubItems.Add(testtt(textBox1.Text)[1]);
item.SubItems.Add(testtt(textBox1.Text)[2]);
item.SubItems.Add(testtt(textBox1.Text)[3]);
item.SubItems.Add(testtt(textBox1.Text)[4]);
item.SubItems.Add(testtt(textBox1.Text)[5]);
item.SubItems.Add(testtt(textBox1.Text)[6]);
listView1.Items.Add(item);
if (textBox1.Text == "")
listView1.Items.Clear();
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
}
}
前
{"Index and length must refer to a location within the string.\r\nParameter name: length"} System.Exception {System.ArgumentOutOfRangeException}
答案 0 :(得分:1)
这很简单。当您从流读取器读取的行,并且您将值拆分并存储在xd中时,将始终显示此错误。假设xd的长度是n。你输入的sokord字符串说长度。现在你写的时候:
(xd[i].Substring(0, sökord.Length)
只要n的xd的长度小于m,子串函数就会尝试从n个字母中创建m个字母的子串。因此它会给出你提到的错误。
无论如何只需要一个简单的检查即可:
String sString = null;
if(xd[i].length>=sokord.length){
sString = xd[i].SubString(0,sokord.length).toLower();
if(sString.equals(sokord.toLower()))
return xd;
}
Digvijay
PS:说实话,我已经从最能理解的内容中找到了答案,所以在一个场景中代码可能有点偏离。但无论如何,我上面描述的错误是100%正确的。因此,如果你只是调查并跟踪轨道,那将是最好的。 =)答案 1 :(得分:0)
仍然不知道我是否正确理解了这个问题,但是这会更容易阅读和理解吗?
private String[] FindSome(String searchword)
{
foreach (String s in System.IO.File.ReadLines("myfile.txt"))
{
String[] tmp = s.Split('c');
foreach (String t in tmp)
{
if (t.StartsWith(searchword,StringComparison.CurrentCultureIgnoreCase)) return tmp;
}
}
return null;
}