2012-04-03 5 views
2
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 не печатает правильно?

первый элемент является строкой, а другой представляет собой целое число. Это должно быть хорошо, но по какой-то причине оно неправильно печатается.

+4

Почему вы используете циклы 'ArrayList' и' for', вроде 2002? – jason

+0

Вы серьезно задаете вопрос, почему он переводит ваш 'Type' в' String'? Пожалуйста, сделайте больше исследований, прежде чем задавать quesiton. –

ответ

1

Вы можете получить поведение, которое ищете, переопределив ToString() в вашем классе Continent.

Console.WriteLine преобразует объекты в строки, вызывая метод ToString для каждого объекта. Object.ToString() возвращает имя типа объекта. Вы не переопределили метод в своем типе, поэтому ToString возвращает имя класса.

7

Вы печатаете объекты континентов, а не их отдельные части. Вы можете изменить свой цикл, чтобы быть:

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

Или вы можете добавить функцию «ToString» внутри «Континент» объект правильно распечатать его.

Это будет выглядеть (внутри объекта Continent):

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

Вы говорите это, чтобы напечатать объект на c[i], который вызывает c[i].ToString(), который Rturns имя типа.

Язык не имеет представления о том, какие члены этого объекта вы хотели бы напечатать. Итак, если вы хотите напечатать (например) название континента, вам необходимо передать это значение 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 
0

Поскольку каждый элемент имеет тип континента, вам нужно бросить перед печатью:

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

Это не проблема ArrayList, это проблема с классом континентов. Вот сделка: всякий раз, когда вы пытаетесь напечатать объект, CLR вызывает этот метод ToString(), чтобы получить его удобное визуальное представление.

Чтобы показать свои материки лучше, вы должны идти в класс континента и добавьте следующие строки:

public override string ToString() 
{ 
    return Name; 
} 
0

Поскольку ваш ArrayList содержит объекты типа континента. Выполняя Console.WriteLine ("{0}", c [i]);

Вы печатаете весь объект Continent. Я не знаю полей вашего объекта Continent. Но если вы хотите распечатать строковое значение, вы должны распечатать это поле. Например, если ваш класс выглядит следующим образом

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

Затем вы должны сделать консоли.WriteLine ("{0}", c [i] .getContinent());

Смежные вопросы