【问题标题】:A two-dimensional ArrayList returns System.String[]二维 ArrayList 返回 System.String[]
【发布时间】:2019-03-05 14:40:26
【问题描述】:

arraylist 返回的值有问题。

我创建了一个包含字符串数组的二维 Arraylist,当我尝试获取字符串数组的实际值时,我得到 System.String[] 作为输出 而不是数组的实际值。

为什么我得到System.String() 作为输出?

这是我的代码:

static void Main(string[] args)
{
    string[] employee_1 = { "Employee1" };
    string[] employee_2 = { "Employee2" };

    ArrayList main_array = new ArrayList();

    main_array.Add(employee_1);
    main_array.Add(employee_2);

    for (int i= 0; i < 2; i++) 
    {
        Console.WriteLine(main_array[i]);                
    }
    Console.ReadKey();
}

【问题讨论】:

标签: c#


【解决方案1】:

因为在外部 ArrayList 中有 string[] 类型的元素。 列举的最佳示例在上面的答案中。如果你真的需要字符串的字符串内容,你应该使用

Console.WriteLine(((string[])main_array[i])[0]);

【讨论】:

    【解决方案2】:

    这是因为当从 ArrayList 检索项目时,您得到的是对 object 的引用,而不是实际类型。因此,在打印时调用对象的ToString(打印类型的名称)而不是您想要的字符串。此外,在打印集合时(就像您在 WriteLine 命令中所做的那样),您需要指定如何执行此操作,因为它的默认实现也是对象的。您可以使用string.Join 打印嵌套数组中的所有项目。

    要更正这个第一次转换为string[]as string[])然后打印,或者更好的是使用列表对象:List&lt;string[]&gt;。要了解更多信息,请参阅:

    所以:

    var mainCollection = new List<string[]> { new string[] { "Employee1" },
                                              new string[] { "Employee2" }};
    for (int i = 0; i < mainCollection.Count; i++) 
    {
        Console.WriteLine(string.Join(", ", mainCollection[i]));
    }
    Console.ReadKey();
    

    作为旁注,不要循环到2,而是循环到集合中的项目数。见:What is a magic number, and why is it bad?

    【讨论】:

    • 最后,请确保这些string[] 不是作为具有适当属性的自定义类更好..
    • 这一次我得到一个“Employee1”和“Employee2”的“匿名类型”错误。我该如何纠正它?
    • @AhmetFurkan - 你是对的。我在初始化列表时出错。见更正
    • 感谢@Gilad Green 的解决方案。我会处理你向我推荐的。
    • @AhmetFurkan - 不客气 :) 如果最后您确实将此答案用于您的解决方案,请考虑将其标记为解决未来读者使用问题的答案。
    【解决方案3】:

    问题就在这里,ArrayList 总是将输入作为对象。因此,当您在 ArrayList 中添加字符串数组时,它需要一个对象而不是字符串数组。

    因此,您应该将此对象转换为字符串数组并打印出来。 如下:

            for (int i = 0; i < 2; i++)
            {
                Console.WriteLine(string.Join(", ", main_array[i] as string[]));
            }
    

    也可以在下面使用(两者相同):

            for (int i = 0; i < 2; i++)
            {
                foreach (string employee in main_array[i] as string[])
                {
                    Console.WriteLine(employee);
                }
            }
    

    【讨论】:

      【解决方案4】:

      main_array 是一个两个位置的 ArrayList,每个位置包含一个 string[] 这是一个 string 数组。

      如果您使用main_array[0],这是对employee_1 的引用,这是一个string 数组。

      您应该可以使用main_array[0][0] 引用数组字符串

      试试这个:

      foreach(var strArray in main_array)
      {
          // strArray is a string array
          foreach(var stir in strArray)
          {
              // star is a string
              Console.WriteLine(str);
          }
      }
      

      【讨论】:

      • 第二个 foreach 循环有问题。我收到“GetEnumerator”错误。可以再看一遍吗?
      • @AhmetFurkan 那是因为strArray 不知道main_array 中的数据类型,所以你必须在第一个foreach 上明确地做string[] 而不是var,他的第二个foreach 也有一个错字,应该是str 而不是stir
      • 谢谢@Prix,在我修改了你所说的之后,它对我有用。
      • @AhmetFurkan 很好,它对您有用,但您仍应遵循 @GiladGreen 的建议并使用 List&lt;string[]&gt; 而不是 ArrayList,您可以在他发布的 2 个链接上阅读更多关于原因的信息回答。
      • @Prix 好的,我会的。我只是想知道这个问题的原因。我想,弄清楚这是怎么回事。再次感谢您的 cmets。
      【解决方案5】:

      这是ToString() 函数对数组的默认行为。

      要打印员工姓名,您需要迭代数组:

      for (int i= 0; i < 2; i++) 
      {
          foreach(string employee in main_array[i]) {
              Console.WriteLine(employee);
          }
      }
      

      【讨论】:

      • 当我尝试这样做时,我收到一个关于“GetEnumerator”的错误
      猜你喜欢
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 2013-03-24
      • 2011-07-07
      • 2018-10-20
      相关资源
      最近更新 更多