0

streamreader を使用して txt ファイルから読み取り、結果を検索してリストビューに表示する簡単なリアルタイム検索を試みています。問題は、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}
4

2 に答える 2

1

これはかなり単純です。このエラーは、ストリーム リーダーから読み取った行を分割して xd に格納すると、常に表示されます。xd の長さを n とします。そして、あなたが入力した sokord 文字列の長さは m です。ここで、次のように記述します (xd[i].Substring(0, sökord.Length) 。n である xd の長さが m 未満の場合、Substring 関数は 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;
    }

ディグビジェイ

PS: 正直に言うと、何をしようとしているのかを理解できる範囲で回答を書いたので、あるシナリオではコードが少しずれている可能性があります。しかし、いずれにせよ、私が上で説明したエラーは 100% 正しいです。ですから、それを調べてトラックをたどるのが最善でしょう。=)

于 2012-12-12T13:11:26.347 に答える
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;
    }
于 2012-12-12T13:21:03.597 に答える