打印ArrayList的值而不是类名

问题描述

我想为ArrayList AL中的每个对象打印所有十个随机生成的点。

public class Point
    {
        public int x;
        public int y;
    
        public Point(int x,int y)
        {
            x = this.x;
            y = this.y;
        }
        
    }    

public class ArrayListTest
    {
        public static void Main(string[] args)
        {
            ArrayList AL = new ArrayList();
            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 myList)
        {
            
            foreach (Object obj in myList)
                Console.WriteLine("{0} ",obj);
        }
    }

控制台上的输出

Point 
Point 
Point 
Point 
Point 
Point 
Point 
Point 
Point 
Point 

我的问题是,打印的是对象的类名,而不是对象的值。 我正在使用.NET Framework v4.8

解决方法

(此外:我建议您不要定义自己的名为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的{​​{1}}将为您执行强制转换:

IEnumerable

但是,最好使用foreach (Point p in myList) { Console.WriteLine("X={0},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},p.x); } } } System.Drawing.Point结构,而不是滚动自己的System.Windows.Point类。

,

您没有使用通用集合,在这里更理想。但是由于您并非如此,因此您正在使用object。对象上的默认ToString实现将返回对象的名称。您需要将对象转换回Point类型才能使用。

这是将对象投射回一点的一种方法

public static void PrintValues(IEnumerable myList)
{
    
    foreach (var point in myList.Cast<Point>())
        Console.WriteLine($"{obj.X} {obj.Y}");
}