问题描述
我想为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}");
}