将实例化对象放入数组

Posted

技术标签:

【中文标题】将实例化对象放入数组【英文标题】:Putting instantiated objects in arrays 【发布时间】:2015-01-10 03:26:35 【问题描述】:
    下面是我为我的编程课编写的程序的所有代码。我的主要问题是,当我调用 AddPerson() 时,它会跳过 _people[] 中的位置 [0] 并将创建的对象放置在 _More[] 的 [1] 中。如何在向数组添加新创建的对象的同时防止这种情况发生? 另外,我需要在最后以有序的形式显示数组中的所有数据。我相信我在 GroupOfPeople 类的 DisplayAllPeople() 方法中有正确的代码。

我希望我的大部分内容都是正确的。谁能帮帮我?

*我们的老师为我们(学生)提供了一个名为 IOHelper 的类,但我没有包括它,因为它只是静态方法。

//主程序//

公开课课程 公共静态无效主要(字符串[]参数) GroupOfPeople 组 = 新 GroupOfPeople();

        while (IOHelper.AskYesNoQuestion("Do you want to add another person to the array? "))
        
            Console.Write("Name?   :");
            string name = Console.ReadLine();
            Console.Write("Age?    :");
            int age = int.Parse(Console.ReadLine());
            Person newPerson = new Person(name, age);

            group.AddPerson(newPerson);

        

        Console.WriteLine("Here are your entries:");

        group.DisplayAllPeople();

        Console.Write("Press any key to end the program... ");
        Console.ReadKey();
    

 

//人物类//

公共类人 私有字符串 _name 获取;放; 私人 int _age 得到;放;

    public Person(string name, int age)
    
        _name = name;
        _age = age;
    


    public void Display()
    
        Console.Write("Name : " + _name);
        Console.Write("Age  : " + _age);
        Console.WriteLine();
    

//GroupOfPeople 类//

公共类 GroupOfPeople 私人人[] _people;

    public GroupOfPeople()
    
        _people = new Person[0];
    

    public void AddPerson(Person newPerson)
    

        Person[] _More= new Person[_people.Length +1];
        _More[_people.Length] = newPerson;
        _people = _More;

    



    public void DisplayAllPeople()
    
        foreach (Person newPerson in _people)
        
            newPerson.Display();
        

    

【问题讨论】:

【参考方案1】:

按照您现在的编码方式,每次添加人员时,您都在创建一个新数组,并且只保存最后添加的人员:

   Person[] _More= new Person[_people.Length +1];
   _More[_people.Length] = newPerson;
   _people = _More;

如果您想在每次添加条目时重新调整数组的大小,您应该将已经存在的元素复制到新创建的数组中。

另外,如果您要重新调整数组的大小,更好的方法是预先分配比您需要的更多的空间,并且每次将大小增加一定数量,与数组的当前大小成正比(这可以为数组大小的 1/2、3/4 或其他比例)。这样您就不会在每次添加元素时产生调整大小(复制数组的先前元素)的成本。

或者,如果您的编程任务允许,您也可以使用使用数组后备存储的通用 List<Person>

【讨论】:

【参考方案2】:

您需要将引用从旧数组复制到新数组:

public void AddPerson(Person newPerson)

    Person[] _More= new Person[_people.Length +1];
    Array.Copy(_people, _More, _people.Length);
    _More[_people.Length] = newPerson;
    _people = _More;


【讨论】:

这就像一个魅力!实际上我以前有那个,当我试图让它全部工作时,我不小心把它拿出来忘了放回去。谢谢你的帮助!

以上是关于将实例化对象放入数组的主要内容,如果未能解决你的问题,请参考以下文章

Python —— 实例化ndarray对象

在ASP.NET开发网站过程中总会遇到未将对象引用到实例化这样的错误 我是初学者 请问该怎么办

Javascript 中数组与对象的实例化。数组啥时候是对象,啥时候得到数组的方法?

缓存池随笔

我可以使用实例化的对象作为数组键吗?

数组实例化调用构造函数? [复制]