【问题标题】:How to print objects in an array using for/foreach?如何使用 for/foreach 打印数组中的对象?
【发布时间】:2015-06-09 06:11:05
【问题描述】:

我有一个作业分配来遍历对象数组并使用forforeach 打印出这些对象。我被困在如何这样做。

问题

当你使用 foreach 循环时,你不必声明对象吗?所以foreach 循环中声明的对象为空,因为它没有调用我的Employee 类中的任何构造函数。

代码片段

    while ((worker = Employee.ReadFromFile(employeeDataReader)) != null)
    {
        employeeInfo[j] = worker;
        j++;
    }

    foreach (Employee person in employeeInfo)
    {
        person.Print(); 
    }

如何打印出数组中包含的对象?我“做错了吗”?有没有更好的办法?

【问题讨论】:

  • 该代码不起作用吗?你有任何错误吗?
  • ReadFromFile() 是否返回一个新的 Employee 对象?
  • foreach 循环看起来不错,我倾向于进入 Employee.ReadFromFile 看看它在做什么。
  • 他可能得到了NullReferenceException,因为数组的大小大于employeeDataReader 中的员工数量。
  • 你的数组是如何声明的?你怎么知道它有多大?

标签: c# .net oop


【解决方案1】:

我有点困惑。 或许你也有些困惑。

while ((worker = Employee.ReadFromFile(employeeDataReader)) != null)
{
    employeeInfo[j] = worker;
    j++;
}

这段代码(希望)创建了一系列员工。在 Employee.ReadFromFile 中的某个时刻,调用了一个 Employee 构造函数。构造的员工卡在数组中

foreach (Employee person in employeeInfo)
{
    person.Print(); // method that prints out information of each object of the employee class
}

在此代码中,仅当前一个循环中的 worker 为 null(您的边界条件阻止)时, person 才为 null。您不再需要调用任何构造函数,因为您只是从数组中取出先前构建的员工。


EDIT SLaks 的回答被否决了,所以我将指出他对这个问题的评论:你的数组的长度可能大于你正在阅读的 Employee 的数量。这个占空值。如果可以选择使用List<Employee>,对于employeeInfo 将避免此问题。

【讨论】:

  • 我认为反对票(我没有这样做)是针对他的原始答案,而不是经过编辑的非常值得赞成的投票(我这样做了)。
  • 啊,谢谢,我的数组大于文件长度!但是我们应该创建一个大小为 10 的数组,而不是使用列表。不知道为什么。
  • @Alex 你应该知道为什么不,哈哈。让我提示一下:您的程序是否可以处理任意长度的文件?
  • 哦,哇,谢谢!但是为什么我们要做一个大小为 10 的数组而不是大小为 5 的数组(这是文件信息的大小)
  • @Alex 那么,这可能是一个让您考虑一般情况的练习。本着“将其作为练习”的精神,在旧系统崩溃时启动您的 prog。在调试器中运行它。你现在知道是什么破坏了它,所以检查它。了解如何使用调试器。它是您最好的朋友,而且 Visual Studio 拥有世界一流的调试器。
【解决方案2】:

我怀疑你的问题是数组没有满,一旦你的循环用完了员工,它就会抛出一个NullReferenceException

您应该使用List<T>,而不是数组。当你调用Add 方法时,List<T> 会自动调整大小,这样它就不会太大或太小。一般来说,如果您不知道具体有多少项,则应始终使用List<T> 而不是数组。

例如:

List<Employee> employeeInfo = new List<Employee>();

while ((worker = Employee.ReadFromFile(employeeDataReader)) != null) {
    employeeInfo.Add(worker);
}

foreach (Employee person in employeeInfo) {
    person.Print(); // method that prints out information of each object of the employee class
}

此外,在您的情况下,您不需要数组或列表;您可以将其完全取出并编写以下内容:

while ((worker = Employee.ReadFromFile(employeeDataReader)) != null) {
    worker.Print();
}

【讨论】:

  • “我有一个家庭作业分配遍历一个对象数组并使用 for 和 foreach 打印出这些对象。” List&lt;T&gt; 似乎不是一个选项。
  • 为什么?您从哪里得知 List 在他的情况下是更合适的数据类型(特别是考虑到这是家庭作业)?
  • 我没有投反对票,但那个编辑并没有真正让你的原始论文变得更好......为什么在你不知道要求的情况下建议一种数据类型?
  • 我们确实对数据类型有所了解,因为他指定了一个对象数组。
  • @Jason 是的,我同意。我们知道他想使用一个数组,他问了一个关于迭代器的问题......所以我不知道为什么 List 建议最初是作为答案出现的。新的答案要好得多。我想我会投票。
【解决方案3】:

这样的 foreach 循环:

foreach (Employee person in employeeInfo) {
   ...
}

工作起来很像这样的循环:

for (int i = 0; i < employeeInfo.Length; i++) {
   Employee person = employeeInfo[i];
   ...
}

因此,您在 foreach 循环中指定的变量会从数组中的每个项目中获取它的值。

请注意,foreach 循环会迭代数组中的所有项。如果您声明的数组比文件中的项目大,您应该只遍历填充的项目:

for (int i = 0; i < j; i++) {
   Employee person = employeeInfo[i];
   ...
}

或:

foreach (Employee person in employeeInfo.Take(j)) {
   ...
}

【讨论】:

    【解决方案4】:

    听起来他们想让你做一个

    for(int i=0;i<someArray.Length;i++)
        someArray[i].print();
    

    foreach(SomeType item in someArray)
        item.print();
    

    我建议你自己研究一下差异:)

    编辑:

    您可能会觉得这篇文章不错:
    http://www.csharp-station.com/Tutorials/lesson04.aspx

    【讨论】:

      【解决方案5】:

      您可能应该创建一个 Employee ToString() 方法来打印出 Employee 的字符串表示,然后您可以执行类似 Console.WriteLine(emp.ToString());在你的 for 循环中。

      【讨论】:

        【解决方案6】:

        不确定我是否理解。

        要遍历对象集合,您需要了解基本概念。

        int[] integerArray = new integerArray[] {1, 2, 3, 4, 5};
        
        foreach (int i in integerArray)
        {
          Console.Writeline("{0} is the integer.", i);
        }
        

        【讨论】:

          【解决方案7】:

          我同意您应该使用List&lt;T&gt;,因为它可以轻松地动态调整大小。

          你没有在这里展示它,但我假设你有类似的东西

          EmployeeInfo[] employeeInfo = new EmployeeInfo[10];
          

          在上面。问题是,如果您在 ReadFromFile 方法中仅加载 5 个项目,则项目 5-9 将未初始化。

          你也可以这样做:

          foreach (Employee person in employeeInfo)
          {
               if (person != null)
               {
                   person.Print(); // method that prints out information of each object of the employee class
               }
           }
          

          【讨论】:

            猜你喜欢
            • 2020-11-21
            • 2015-05-10
            • 2018-04-20
            • 1970-01-01
            • 1970-01-01
            • 2012-05-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-02
            相关资源
            最近更新 更多