为什么 ArrayList 无法正确打印

本文关键字:打印 ArrayList 为什么 | 更新日期: 2023-09-27 18:30:05

ArrayList c = new ArrayList();
c.Add(new Continent("Africa", af));
c.Add(new Continent("America", am));
c.Add(new Continent("Asia", a));
c.Add(new Continent("Oceania", oc));
c.Add(new Continent("Europe", eu));
c.Sort();
for (int i = 0; i < c.Count; i++)
{
Console.WriteLine("{0}", c[i]);
}

output:
TP.Continent
TP.Continent
TP.Continent
TP.Continent
TP.Continent

构造函数很好,因为它在不告诉我有错误的情况下排序

第一个元素是字符串,另一个是整数。它应该没问题,但由于某种原因无法正确打印。

为什么 ArrayList 无法正确打印

您正在打印大陆对象,而不是其各个部分。 您可以将循环更改为:

for (int i=0; i<c.Count; i++)
{
Console.WriteLine("{0}", c[i].name); // Or whatever attributes it has
}

或者您可以在"大陆"对象中添加"ToString"函数以正确打印出来。

这看起来像(在大陆对象内部(:

public override string ToString()
{
return "Continent: " + attribute; // Again, change "attribute" to whatever the Continent's object has
}

你告诉它在 c[i] 处打印对象,这会调用 c[i].ToString() ,这会转换类型的名称。

该语言无法深入了解您实际要打印此对象的哪些成员。 因此,如果要打印(例如(大陆的名称,则需要将其传递给Console.WriteLine。 或者,您可以重写类型ToString以返回更有意义的字符串。

附带说明一下,几乎没有充分的理由再使用ArrayList了。 更喜欢强类型的泛型集合,即

var list = new List<Continent>();
list.Add(new Continent("", whatever)); // ok
list.Add(1); // fails! The ArrayList would allow it however
您可以通过

覆盖Continent类中的ToString()来获得所需的行为。

Console.WriteLine 通过对每个对象调用 ToString 方法将对象转换为字符串。 Object.ToString() 返回对象类型的名称。 您尚未重写类型中的方法,因此 ToString 将返回类的名称。

这不是 ArrayList 的问题,而是 Continent 类的问题。交易是这样的:每当您尝试打印对象时,CLR 都会调用该对象 ToString(( 方法来获得用户友好的可视化表示形式。

为了更好地展示您的大陆,您必须转到大陆类并添加以下行:

public override string ToString()
{
    return Name;
}

由于每个元素的类型都是 Continent,因此您需要在打印它们之前进行强制转换:

Console.WriteLine("{0}",((Continent)c[i]).YourProperty);

因为您的数组列表包含大陆类型的对象。通过做 Console.WriteLine("{0}", c[i](;

您正在打印整个大陆对象。我不知道你的大陆对象的字段。但是,如果要打印出字符串值,则应打印出该字段。例如,如果您的类看起来像这样

Class Continent { private String continentName; public getContinent() { return continentName; } }

那你应该做Console.WriteLine("{0}", c[i].getContinent(((;