Console.WriteLine(ArrayList) неправильный вывод

Я пытаюсь распечатать содержимое ArrayList различных циклов foreach, но единственное, что я получаю, это String + System.Collections.ArrayList.

Например следующий код:

ArrayList nodeList = new ArrayList();
foreach (EA.Element element in elementsCol)
{
    if ((element.Type == "Class") || (element.Type == "Component") || (element.Type == "Package"))
    {
         nodeList.Add(element);
    }
    Console.WriteLine("The nodes of MDG are:" + nodeList); //stampato a schermo la lista dei nodi nel MDG finale

И вывод, который я получаю:

The nodes of MDG are:System.Collections.ArrayList

Может кто-нибудь сказать мне, почему?


person Defi    schedule 16.05.2012    source источник
comment
Почему вы используете массив, а не список «T»?   -  person Joel Coehoorn    schedule 16.05.2012
comment
потому что со списком у меня возникают проблемы с типами, которые я туда добавляю, а затем, когда я использую эти списки в своих циклах foreach.   -  person Defi    schedule 16.05.2012


Ответы (5)


вам нужно пройти через массив, чтобы получить его значение...

foreach(var item in nodeList)
{
    Console.WriteLine("The nodes of MDG are:" + item);
}

Это сработает..

Обновлено:

Использовать элемент вместо нодлиста

Console.WriteLine("The nodes of MDG are:" + element);
person Kishore Kumar    schedule 16.05.2012
comment
Вы хотите напечатать The nodes of MDG are: для элемента охвата? - person Mike Park; 16.05.2012
comment
Console.WriteLine(arrayList1); не работает, и, похоже, это то, что вы предлагаете с вашим странным обновлением. Он просто напечатает тип. И помещать Console.WriteLine(arrayList1) в цикл еще более нелепо, он просто будет повторно отображать тип. Я предполагаю, что ваш первый абзац с кодом был в порядке, но остальное не имеет смысла. - person barlop; 01.03.2016

Преобразование в строку для nodeList просто вызовет nodeList.ToString(), который выдаст результат, который вы видите. Вместо этого вам нужно перебирать массив и печатать каждый отдельный элемент.

В качестве альтернативы вы можете использовать string.Join:

Console.WriteLine("The nodes of MDG are:" + string.Join(",", nodeList));

Кстати, нет причин (или оправдания) для использования ArrayList в C# 2 и выше — если вы не поддерживаете устаревший код, переключитесь на List<T>

person BrokenGlass    schedule 16.05.2012
comment
Я попробовал этот метод и не работает, я получаю System.__ComObject для каждого элемента в моем массиве. Как я могу получить значения, которые у меня есть в моем массиве, а не тип значения? - person Defi; 16.05.2012
comment
@Defi: в этом случае элементы в списке не имеют удобной для пользователя реализации ToString(). Используйте цикл foreach и запишите свойства, которые вы хотите конкретно. - person BrokenGlass; 16.05.2012

Прежде всего, нет веских причин использовать ArrayList в C#. Вы должны по крайней мере использовать System.Collections.Generic.List<T> вместо этого, и даже здесь они могут быть доступной более конкретной структурой данных. Никогда не используйте нетипизированную коллекцию, такую ​​как ArrayList.

Во-вторых, когда вы передаете объект в Console.Writeline(), он просто вызывает метод .ToString() объекта.

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

Реализация .ToString() для базового типа объекта просто выводит тип объекта. Поэтому поведение, которое вы опубликовали, является именно тем, что ожидается.

Я не знаю причин выбора не переопределять .ToString() для массивов и других типов последовательностей, но простой факт заключается в том, что если вы хотите, чтобы это распечатало отдельные элементы в массиве, вы должны написать код для перебрать элементы и распечатать их самостоятельно.

person Joel Coehoorn    schedule 16.05.2012

Это вызывает nodeList.ToString(). Было бы разумнее запустить ToString() для каждого элемента в списке и соединить их вместе:

Console.WriteLine("The nodes of MDG are:" + string.Join(", ", nodeList));
person Kvam    schedule 16.05.2012
comment
Не в 4.0. 4.0 имеет перегрузку IEnumerable. :-) - person Kvam; 16.05.2012
comment
Ах, пора бы им это сделать. Мне нужно обновиться до версии 4.0 - person Mike Park; 16.05.2012
comment
Абсолютно. Но поправлю: есть перегрузка IEnumerable‹T›, а не IEnumerable. Таким образом, ArrayList будет считаться просто еще одним объектом в контексте, а возвращаемое значение string.Join(, , nodeList) будет System.Collections.ArrayList. Я думаю, что ToArray все-таки нужен. Или, что предпочтительнее, переключитесь на List‹T›. - person Kvam; 16.05.2012
comment
этот string.Join(", ", nodeList) не работает, он просто отображает System.Collections.ArrayList - person barlop; 01.03.2016
comment
по-прежнему неправильный вывод отображается с использованием этого метода - person PRATEEK GHOSH; 13.10.2017

Я получил результат, который хотел, со следующим кодом:

using System.IO

using (StreamWriter writer = new StreamWriter("C:\\out.txt"))
        {
            Console.SetOut(writer);
         }

Console.WriteLine("the components are:");
        foreach (String compName in componentsList)
        { Console.WriteLine(compName); }

где componentList - это мой список массивов, который я хотел напечатать.

Спасибо за вашу помощь

person Defi    schedule 24.05.2012