List.Add不增加List.Count

时间:2014-08-01 02:47:43

标签: c# list

我正在尝试向List<String>添加元素,以便我可以从队列中一次删除一个元素。以下是将内容添加到我的列表中的代码:

foreach (String s in q)
{
    if(s != null)
    {
        String str = s.Replace("!question", "");
        questions.Add(str);
        this.label1.Text = str;
    }
}

q是我用来分割的数组,问题是List<String>。 Label1应该是无关紧要的(我正在使用Windows窗体)

以下是我用来尝试删除列表中第二行的代码。它引发了“超出范围”的异常:

questions.RemoveAt(1);
Console.WriteLine(questions.Count);
foreach(String s in questions)
{
    if (s!= null)
        this.label1.Text = s;
}

当它打印到控制台时,Count是一个,但如果我打印列表,它会给我正确的列表:

test 1
test 2
test 3 
....

我的假设是我的所有字符串都被添加到带有返回字符的第一个索引下的列表中,但我不太确定它是如何工作的。谢谢大家!

编辑输入.txt:

test 1 \t
test 2 \t
cellosan asks: !question are we getting secret stream? \t
cellosan asks: !question read chat pls \t
cellosan asks: !question sorry for bothering you too \t

编辑完整代码

namespace Question_Queue
{
    public partial class Form1 : Form
    {
        public String fullText;
        public String[] questionList;
        public List<String> questions;
        public int i = 0;
        public String[] q;

        public Form1()
        {
            InitializeComponent();
            questionList = new String[20];
            q = new String[30];
            questions = new List<String>(20);

        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        //This is the refresh button
        private void button1_Click(object sender, EventArgs e)
        {
            using (FileStream fs = File.Open("C:\\Users\\Lilianne\\Desktop\\questions.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using(StreamReader questionDoc = new StreamReader(fs))
                {
                    //Now we have the stuff in question doc.  Let's make an array for all the questions
                    if (questionDoc.ReadLine() != null)
                    {
                        fullText = questionDoc.ReadToEnd();
                        questionList = fullText.Split('\t');
                        for (int j = 0; j < questionList.Length; j++)
                        {
                            questionList[j] = questionList[j].Replace("!question", "");
                            questionList[j] = questionList[j].Replace("\t", "");
                            this.label1.Text = questionList[j];
                        }

                    }
                    else
                        this.label1.Text = "No questions!";

                    questionDoc.Close();
                }
            }

        }

        private void Answered_Click(object sender, EventArgs e)
        {
            using (FileStream fs = File.Open("C:\\Users\\Lilianne\\Desktop\\questions.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                using(StreamReader sr = new StreamReader(fs))
                {
                    //First, remove the topmost question, which is the second line
                    Console.WriteLine(questions.Count);
                    //questions.RemoveAt(2);
                    foreach(String s in questions)
                    {
                        if (s!= null)
                            this.label1.Text = s;
                    }

                }
            }
        }


        private void ClearQueue_Click(object sender, EventArgs e)
        {
            File.WriteAllText("C:\\Users\\Lilianne\\Desktop\\questions.txt", "***** EMPTY LINE *****");
        }

        private void Load_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click_2(object sender, EventArgs e)
        {
            using (FileStream fs = File.Open("C:\\Users\\Lilianne\\Desktop\\questions.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (StreamReader sr = new StreamReader(fs))
                {
                    if (sr.ReadLine() != null)
                    {
                        fullText = sr.ReadToEnd();
                        q = fullText.Split('\t');


                        foreach (String s in q)
                        {
                            if(s != null)
                            {
                                String str = s.Replace("!question", "");
                                questions.Add(str);
                                this.label1.Text = str;
                            }
                        }
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我假设您有两个按钮,第一个应该用文件的内容填充列表,而第二个“应答”按钮应该打印计数并从列表中删除一个项目。 (我没有看到打印列表内容的电话,而且,不知道你打电话的地方,我无法帮助解决这个问题。)

我可以在这里看到一些问题。首先,您有两个事件处理程序,可以根据文件的内容填充列表,即

private void button1_Click(object sender, EventArgs e)

private void button1_Click_2(object sender, EventArgs e)

如果您在按下“接听”按钮之前调用button1_Click,那么这就是您获得超出范围异常的原因。处理程序button1_Click正在填充questionList,而Answered_Click正在从问题中读取数据(或缺少数据),而这些问题尚未填充任何数据。

简而言之,请检查您的事件处理程序是否已正确映射。

我还想指出对

的呼吁
sr.ReadLine() 

返回第一行的内容并将流移动到第二行。我不确定你是否打算跳过第一行并直接转到第二行,而只是调用

sr.ReadToEnd()

应该足够了。

此外,由于文件在文件末尾包含一个选项卡(\ t),并且您要在\ t字符上拆分字符串,因此数组中的最后一条记录将始终为空字符串。这就是为什么

this.label1.Text = s;

似乎不显示任何文字。正在喂空字符串。

编辑:此外,这不是完整的代码。包括设计师代码在识别问题时非常方便。