(Кроме того: я рекомендую вам не определять свой собственный класс с именем Point
. Он может конфликтовать со встроенным классом и вызывать путаницу. Вы должны дать своему классу другое имя.)
Итак, что происходит, когда вы делаете Console.WriteLine(object obj)
, так это то, что внутри Console.WriteLine()
он вызывает object.ToString()
, чтобы определить строку для записи.
По умолчанию, если вы не напишете собственную реализацию ToString()
, она вернет имя класса — вот почему вы видите Point
в выводе.
Поскольку вы пишете свой собственный класс Point
, вы можете переопределить его ToString()
, чтобы он возвращал отформатированную строку. Это лучшее решение.
Предполагая, что ваш класс Point
имеет значения X и Y, вы можете сделать это, добавив в класс следующее:
public override string ToString()
{
return $"X={x}, Y={y}";
}
Если вы не хотите этого делать (или предположим, что это сторонний класс, который вы не можете изменить), вам придется явно отформатировать строку, прежде чем передавать ее в Console.WriteLine()
.
К сожалению, поскольку вы используете ArrayList
, вы получите только object
, поэтому для его форматирования вам нужно будет привести его к правильному типу, чтобы получить его значения X и Y:
foreach (Object obj in myList)
{
Point p = (Point)obj;
Console.WriteLine("X={0}, Y={1}", p.x, p.y);
}
Или вы можете воспользоваться тем фактом, что foreach
вместо IEnumerable
сделает приведение за вас, если вы объявите переменную цикла как правильный тип:
foreach (Point p in myList)
{
Console.WriteLine("X={0}, Y={1}", p.x, p.x);
}
Однако гораздо лучше использовать List<Point>
, а не ArrayList
, тогда элементы будут иметь тип Point
:
static class Program
{
public static void Main(string[] args)
{
List<Point> AL = new List<Point>();
Random Rnd = new Random();
for (int i = 1; i <= 10; i++)
{
Point p = new Point(Rnd.Next(50), Rnd.Next(50));
AL.Add(p);
}
PrintValues(AL);
}
public static void PrintValues(IEnumerable<Point> myList)
{
foreach (var p in myList)
{
Console.WriteLine("X={0}, Y={1}", p.x, p.x);
}
}
}
И последнее замечание: вы можете рассмотреть возможность использования структуры System.Drawing.Point
или System.Windows.Point
, а не своего собственного класса Point
.
person
Matthew Watson
schedule
21.10.2020
Point
класс или подтвердите, что вы используетеSystem.Drawing.Point
. Ваш код отлично работает при использованииSystem.Drawing.Point
. - person Matthew Watson   schedule 21.10.2020