首页 > 解决方案 > 打印 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

标签: c#arraylistconsole.writeline

解决方案


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);
}

或者,如果您将循环变量声明为正确的类型,您可以利用 a foreachfor anIEnumerable将为您执行强制转换的事实:

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.PointorSystem.Windows.Point结构而不是滚动您自己的Point类。


推荐阅读