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
构造函数很好,因为它排序而不告诉我有错误
第一个元素是一个字符串,另一个是整数。它应该没问题,但由于某种原因它无法正确打印。
答案 0 :(得分:7)
您正在打印Continent对象,而不是它们各自的部件。您可以将循环更改为:
for (int i=0; i<c.Count; i++)
{
Console.WriteLine("{0}", c[i].name); // Or whatever attributes it has
}
或者您可以在“Continent”对象中添加“ToString”功能以正确打印出来。
这看起来像(在Continent对象中):
public override string ToString()
{
return "Continent: " + attribute; // Again, change "attribute" to whatever the Continent's object has
}
答案 1 :(得分:6)
您告诉它在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
。更喜欢强类型泛型集合,即
{{1}}
答案 2 :(得分:1)
您可以通过覆盖ToString()
课程中的Continent
来获取您正在寻找的行为。
Console.WriteLine
通过在每个对象上调用ToString
方法将对象转换为字符串。 Object.ToString()
返回对象类型的名称。您没有覆盖类型中的方法,因此ToString返回类的名称。
答案 3 :(得分:1)
这不是ArrayList问题,而是Continent类的问题。这是交易:每当你尝试打印一个对象时,CLR就会调用该对象的ToString()方法来获得它的用户友好的可视化表示。
为了更好地展示您的大陆,您必须转到Continent类并添加以下行:
public override string ToString()
{
return Name;
}
答案 4 :(得分:0)
因为每个元素都是Continent类型,所以在打印之前需要进行强制转换:
Console.WriteLine("{0}",((Continent)c[i]).YourProperty);
答案 5 :(得分:0)
由于您的arraylist包含Continent类型的对象。通过执行Console.WriteLine(“{0}”,c [i]);
您正在打印整个Continent对象。我不知道你的Continent对象的字段。但是如果要打印出字符串值,则应该打印出该字段。例如,如果您的班级看起来像这样
Class Continent
{
private String continentName;
public getContinent()
{
return continentName;
}
}
然后你应该这样做 Console.WriteLine(“{0}”,c [i] .getContinent());