-1

我取得了很大的进步,但现在我在加载文件时遇到了问题。下面是具有文件加载方法的类:

public class BunchOfDeliverables
{
    private List<Person> myPersons;
    private List<Deliverable> myDeliverables;

    public BunchOfDeliverables()
    {
        this.myPersons = new List<Person>();
        this.myDeliverables = new List<Deliverable>();
    }

    public List<Person> Persons { get { return this.myPersons; } }
    public List<Deliverable> Deliverables { get { return this.myDeliverables; } }

    public void LoadPersonsFromFile(String filename)
    {
        StreamReader sr = null;
        try
        {
            sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.Read));
            String name, street, housenr, postalcode, city;
            name = sr.ReadLine();
            while (name != null)
            {
                street = sr.ReadLine();
                housenr = sr.ReadLine();
                postalcode = sr.ReadLine();
                city = sr.ReadLine();
                this.myPersons.Add(new Person(name, street, Convert.ToInt32(housenr), postalcode, city));
                name = sr.ReadLine();
                name = sr.ReadLine(); //and again read a line, because of the delimiter (line with the stars)
            }
        }
        catch (IOException) { }
        finally
        {
            if (sr != null) sr.Close();
        }
    }

    public void LoadDeliverablesFromFile(String filename)
    {
        StreamReader sr = null;
        try
        {
            sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.Read));
            String s;
            s = sr.ReadLine();
            while (s != null)
            {
                String[] items = s.Split();
                this.myDeliverables.Add(new Deliverable(Convert.ToInt32(items[0]), Convert.ToInt32(items[1]), this.myPersons[Convert.ToInt32(items[2])]));
                s = sr.ReadLine();
            }
        }
        catch (IOException) { }
        finally
        {
            if (sr != null) sr.Close();
        }
    }


    public void AddPerson(Person p)
    {
        this.myPersons.Add(p);
    }


    public Deliverable FindDeliverable(int id)
    {
        foreach (Deliverable d in this.myDeliverables)
        {
            if (d.ID == id)
            {
                return d;
            }
        }
        return null;
    }

    public void AddDeliverable(Deliverable d)
    {
        if (FindDeliverable(d.ID) == null)
        {
            myDeliverables.Add(d);
        }
        else
        {
            throw new Exception("Be aware: nothing is added!!!");
        }

    }

在这里 - 以我初始化它们的形式:

public partial class Form1 : Form
{
    BunchOfDeliverables d;
    public Form1()
    {
        InitializeComponent();
        d = new BunchOfDeliverables();
        d.LoadDeliverablesFromFile("../../data/deliverables.txt");
        d.LoadPersonsFromFile("../../data/persons.txt");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        listBox1.Items.Clear();
        foreach (Person per in d.Persons)
        {

            listBox1.Items.Add(per);
        }


    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void ViewDeliv_Click(object sender, EventArgs e)
    {
        listBox1.Items.Clear();
        foreach (Deliverable deliv in d.Deliverables)
        {

            listBox1.Items.Add(deliv);
        }
    }

现在对于 Persons 加载文件,它就像一个魅力,没有任何问题,但是一旦我尝试加载 Deliverables 文件,就会发生以下错误:

指数超出范围。必须是非负数且小于集合的大小。参数名称:索引”在这一行:

“this.myDeliverables.Add(new Deliverable(Convert.ToInt32(items[0]), Convert.ToInt32(items[1]), this.myPersons[Convert.ToInt32(items[2])]));”

下面是一个小例子(没有空行)的可交付成果文件的结构:

1 350 1
2 700 5
3 360 7
4 360 6

任何帮助,将不胜感激!

4

2 回答 2

0

这段代码:

String[] items = s.Split();
this.myDeliverables.Add(new Deliverable(Convert.ToInt32(items[0]), Convert.ToInt32(items[1]), this.myPersons[Convert.ToInt32(items[2])]));

假设输入文件中的每一行至少有三个空格分隔的项目。

如果一行包含较少的项目,您将收到此错误。这可能意味着您的输入文件中存在错误,或者可能意味着文件中存在您的解析未考虑的有效数据。

要简单地跳过没有足够数据的行,您可以这样做:

String[] items = s.Split();
if (items.Count >= 3)
    this.myDeliverables.Add(new Deliverable(Convert.ToInt32(items[0]), Convert.ToInt32(items[1]), this.myPersons[Convert.ToInt32(items[2])]));

但是,这是否有效取决于错误是在数据文件中还是在该数据的预期格式中。如果是数据错误,您应该真正显示错误消息。

于 2013-05-11T09:35:47.163 回答
0

此错误意味着数组items必须缩短元素。所以它只有 0、1 或 2 个元素,而不是 3。

也许您的文件末尾有一个不包含信息的空行。

尝试使用以下命令修改您的 while 循环:

while(!string.IsNullOrWhiteSpace(s))
    ....

您也可以先检查数组中的项目数是否等于 3。

如果所有这些都没有帮助,请在该行放置一个断点。每次您的代码中断时,请检查s和的值items

于 2013-05-11T09:32:13.073 回答