Почему ArrayList не печатает правильно? - PullRequest
2 голосов
/ 03 апреля 2012
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

Конструктор в порядке, потому что он сортирует, не сообщая мне, что есть ошибка

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

Ответы [ 6 ]

7 голосов
/ 03 апреля 2012

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

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

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

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

public override string ToString()
{
return "Continent: " + attribute; // Again, change "attribute" to whatever the Continent's object has
}
6 голосов
/ 03 апреля 2012

Вы предлагаете напечатать объект в 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 голос
/ 03 апреля 2012

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

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

public override string ToString()
{
    return Name;
}
1 голос
/ 03 апреля 2012

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

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

0 голосов
/ 03 апреля 2012

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

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

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

Тогда вам следует выполнить Console.WriteLine ("{0}", c [i] .getContinent ());

0 голосов
/ 03 апреля 2012

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

Console.WriteLine("{0}",((Continent)c[i]).YourProperty);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...