如何初始化一个 Point 数组?

4
我需要初始化一个由三个点组成的数组。 我希望像下面这样写,但只需写一次以表示三个元素。
Point P = new Point { X = 0, Y = 1 };

Point[] P = new Point[3];// <----  ?

如何正确地撰写文章?


@minitech 不,我有一个任务要完成一个包含不同值的数组。 - Mixer
5个回答

14

这里是创建包含3个不同点的数组的代码:

Point[] points = new Point[] { new Point { X = 0, Y = 1 }, new Point { X = 2, Y = 1 }, new Point { X = 0, Y = 3 } };

6

以下示例中,您可以使用Enumerable.Range创建10个Point

var points = Enumerable.Range(0, 10)
            .Select(x => new Point {X = 0, Y = 1})
            .ToArray();

2
Enumerable.Repeat() - SLaks
重复使用相同的Point实例,对吗? - Honza Brestan
@HonzaBrestan:请参考Servy的评论。 - cuongle
2
Point 是一个值类型,因此不可能进行更改,除非问题的提出者创建了自己的自定义 Point 类。 - Servy
@Servy: 你说得非常正确。 - cuongle

6

这方面没有特别的简写方式。对于数字“3”,只需写三次即可:

Point initial = new Point { X = 0, Y = 1 };
Point[] P = new Point[3] { initial, initial, initial };

你是不是想说“初始值,初始值,初始值”,而不是“P,P,P”? - Pieter Geerkens
@PieterGeerkens:只花了几秒钟:D - Ry-
同一个对象的3个引用 - cuongle
1
@CuongLe:抱歉,我假设了System.Drawing.Point是一个值类型。如果不是这种情况,我会删除这个假设。 - Ry-
仅供参考,在此示例中,数组大小不必显式设置(数字3可以省略)。 - Jaanus Varus
@minitech 恭喜你竞选版主成功,你展现了坚韧和决心,并在问答环节中坚持了自己的立场。我确信两件事情:如果你仍然希望,你很快就会实现管理这个社区的目标;而且总有一天你会同意我的成熟观点。哦,对了,我说过这个回答有效吗?已点赞! - tony gil

4

因为您的问题涉及到固定长度、坐标静态的点数组,所以在这种情况下,不需要在初始化数组时使用LINQ和循环。因此,您可以通过以下方式初始化数组:

Point[] P = new Point[] 
{ 
    new Point { X = 0, Y = 1 }, 
    new Point { X = 0, Y = 1 }, 
    new Point { X = 0, Y = 1 },
    ...
};

或者使用类型推断(感谢minitech):

var P = new [] 
{ 
    new Point { X = 0, Y = 1 }, 
    new Point { X = 0, Y = 1 }, 
    new Point { X = 0, Y = 1 },
    ...
};

当编写“简单”解决方案需要更多时间时,你试图节省什么? - Servy
1
在这个问题的背景下,使用传统的数组初始化方式初始化三个静态点比循环或使用LINQ快得多。但是在有大量点或数组是动态时,或者坐标是计算出来的其他情况下,我不介意使用其他方法。 - Larry
静态集合在运行时可能会稍微快一点,但编写/读取/修改需要更多的开发时间。在几乎所有情况下,运行时速度的几个纳秒甚至不值得花费一分钟的开发时间。 - Servy

4
这里是最简单的解决方案:
Point[] points = Enumerable.Repeat<Point>(new Point(0, 1), 3).ToArray();

3
这绝对不是最短的。如果你想在这里进行代码高尔夫比赛,你可以使用 var 代替指定类型,省略 Repeat 的泛型参数,并删除不必要的空格。 - Servy
生成包含一个重复值的序列,对整个数组也是同一个实例。 - constructor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接