How to initialize an array of Point?
我需要初始化一个三点数组。我想像下面这样写,但三个元素只写一次。
1 2 3
| Point P = new Point { X = 0, Y = 1 };
Point [] P = new Point [3];// <---- ? |
如何正确书写?
- @Minitech编号。我有任务完成一系列不同的值
下面是创建3个不同点的数组的代码:
1
| Point [] points = new Point [] { new Point { X = 0, Y = 1 }, new Point { X = 2, Y = 1 }, new Point { X = 0, Y = 3 } }; |
号
下面的示例可以使用Enumerable.Range创建10个Point。
1 2 3
| var points = Enumerable .Range(0, 10)
.Select(x => new Point {X = 0, Y = 1})
.ToArray(); |
- 江户十一〔一〕号
- 重复将使用相同的点实例,对吗?
- @洪扎布雷斯坦:参考Servy的评论
- @honzabrestan Point是一个值类型,因此这是不可能的,除非OP创建了自己的自定义Point类。
- @服务生:你完全正确
没有真正的速记。只需写三次:
1 2
| Point initial = new Point { X = 0, Y = 1 };
Point [] P = new Point [3] { initial, initial, initial }; |
- 你的意思是"初始,初始,初始"而不是"P,P,P"?
- @彼得盖尔肯斯:花了几秒钟:D
- 3对同一对象的引用
- @对不起,我假设System.Drawing.Point是一种值类型。如果不是这样的话,我会删除这个。
- 仅供参考,在此示例中,不必显式设置数组大小(可以省略数字3)。
- @Minitech恭喜你竞选版主,你表现出了坚韧和决心,你在问答中坚守了自己的立场。我相信有两件事:你很快就会实现你的目标,你将负责这个社区(如果你还希望这样做的话),并且有一天你会同意我关于成熟的看法。哦,是的,我说这个答案有效吗?赞成票!
因为您的问题是关于具有静态坐标的点的静态固定长度数组,所以在数组初始化如此简单的情况下,不需要在这个上下文中处理LINQ和循环。
因此,可以通过以下方式初始化数组:
1 2 3 4 5 6 7
| Point [] P = new Point []
{
new Point { X = 0, Y = 1 },
new Point { X = 0, Y = 1 },
new Point { X = 0, Y = 1 },
...
}; |
或使用duck typingtype interrusion(感谢Minitech):
1 2 3 4 5 6 7
| var P = new []
{
new Point { X = 0, Y = 1 },
new Point { X = 0, Y = 1 },
new Point { X = 0, Y = 1 },
...
}; |
。
- 当编写"简单"解决方案需要更多时间时,您要保存什么?
- 同样,在这个问题的上下文中,使用好的旧数组初始化初始化三个静态点要比循环或使用LINQ快得多。我不介意有很多点的其他上下文,或者数组是动态的,或者计算点坐标的时候。
- 静态集在运行时会更快一点,但开发人员需要更多的时间来写/读/修改。实际上,在所有上下文中,运行时速度的几纳秒甚至不值得花费一分钟的开发时间。
以下是最短的解决方案:
1
| Point [] points = Enumerable .Repeat<Point >(new Point (0, 1), 3).ToArray(); |
。
- 它肯定不是最短的。如果您想在这里玩代码高尔夫,可以使用var而不是指定类型,省略Repeat的泛型参数,并删除不需要的空白。
- "生成包含一个重复值的序列。"完整数组的相同实例。