class Space : IEnumerable<Space> {
public object Filler {
get {
return filler ?? (filler = Top.create());
}
}
public Space Upper { get; protected set; }
public Space Top => Upper?.Top ?? this;  private Func<object> create;
private object filler;
public int[] Chain { get; set; }
public int[] Dementions { get; }
Space[] all; static Random r { get; } = new Random(); public Space(int i, params int[] indexes) : this(() => r.Next(), i, indexes) { } public Space(Func<object> create, int i, params int[] indexes) : this(new int[], new[] { i }.Concat(indexes).ToArray()) {
this.create = create;
} private Space(int[] chain, params int[] indexes) {
Chain = chain;
Dementions = indexes;
var i = indexes[];
all = new Space[i];
var chains = Enumerable.Range(, i).Select(e => chain.Concat(new int[] { e }).ToArray()).ToArray();
if (indexes.Length == ) {
while (i-- > ) {
all[i] = new Space(chains[i]);
all[i].Upper = this;
}
} else {
var _indexes = indexes.Skip().ToArray();
while (i-- > ) {
all[i] = new Space(chains[i], _indexes);
all[i].Upper = this;
}
}
filler = all;
} private Space(int[] chain) {
Chain = chain;
} public Space this[int i, params int[] indexes] {
get {
if (all == null) {
return (Filler as Space)?[i, indexes];
}
if (indexes.Length == ) {
return all[i];
}
return all[i][indexes[], indexes.Skip().ToArray()];
}
} public override string ToString() {
return all?.Aggregate(string.Empty, (a, s) => a + s + ',').Trim(',') ?? Filler.ToString();
} public override bool Equals(object obj) {
if (GetType() != obj?.GetType()) {
return false;
}
return GetHashCode() == obj.GetHashCode();
} public override int GetHashCode() {
if (Upper == null) {
return base.GetHashCode();
}
return Top.GetHashCode() - Chain.GetHashCode();
} public IEnumerator<Space> GetEnumerator() {
return ((IEnumerable<Space>)all).GetEnumerator();
} IEnumerator IEnumerable.GetEnumerator() {
return ((IEnumerable<Space>)all).GetEnumerator();
}
}

自定义N维空间数组的更多相关文章

  1. 自定义泛型N维空间数组

    class Space<T> : IEnumerable<Space<T>> { public T Filler { get { if (!ed) { ed = t ...

  2. C 二维数组,以及自定义二维数组

    C 二维数组,以及自定义二维数组 我们通常情况下是这样定义一个二维数组的: int a[10][15]; 我们分别查看一下a,a[0],*a 都是一样的值吧 我们可以这么理解: a是一个数组的数组 a ...

  3. Android生成自定义二维码

    前面说过两种二维码扫描方式,现在说如何生成自定义酷炫二维码.二维码生成需要使用Google开源库Zxing,Zxing的项目地址:https://github.com/ZBar/ZBar,我们只需要里 ...

  4. 分配一维动态数组or 二维动态数组的方法以及学习 new 方法or vector

    先来个开胃菜 // 使用new动态分配存储空间 #include<iostream> using std::cout; int main() { // 第1种方式 int *a=new i ...

  5. [转载]C++二维动态数组memset()函数初始化

    来源:https://blog.csdn.net/longhopefor/article/details/20994919 先说说memset函数: void *memset(void *s,int ...

  6. PHP二维关联数组的遍历方式

    采用foreach循环对二维索引数组进行遍历,相对来讲速度更快,效率更高,foreach循环是PHP中专门用来循环数组的.实例也相对简单,多加练习,想清楚程序运行逻辑即可. <?php $arr ...

  7. javascript 二维(多维)数组的复制问题

    最近在项目中遇到一个动画暂停的效果,需要在动画停止的时候检测当前坐标和已经运行的时间,从而调节时间轴为再次运行时加速. 但是在数组保存方面折腾了半天. var orbitArray = [], lin ...

  8. C语言中二维字符数组的定义和初始化

    本篇日志关于二维字符数组的定义和初始化.我相信这篇文章属于菜鸟级的,高手请直接无视. 一般来说,我们可能会希望定义一个二维字符数组并且在定义的时候就用一些字符串来初始化它.比如说: ][MAX_LEN ...

  9. C++ 指针二维数组, C++二维指针数组笔记

    C++ 二维动态数组 一. 已知第一维 #include <iostream> using namespace std; int main(int argc, char const *ar ...

随机推荐

  1. .net下的跨域问题

    环境: IIS7.0 MVC 4.0     公司官网 asp.net      需要的报名系统,需要有后台管理 由于是配合传统产业,所以MVC系统的数据,是由AIPS系统提供. (制作前是考虑去年用 ...

  2. smartdraw2013破解方法

    smartdraw是一个非常好的画图工作,最大的优点就是支持多种图形,采用模板的方式在线扩充,可以快速画出你想要的图形,具体的介绍见其他资料. 这里是我自己的破解办法. 网上的下载都包含破解工具,但是 ...

  3. poi jar包的作用

    目前POI的最新发布版本是3.10_FINAL.该版本保护的jar包有: Maven artifactId Prerequisites JAR poi commons-logging, commons ...

  4. 使用 Redis 实现排行榜功能 (转载 https://segmentfault.com/a/1190000002694239)

    排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如"用户积分榜".如果没有实效性一直按照总榜来排,可能榜 ...

  5. SVN和Git的异同

    其实Git和SVN还是挺像的,都有提交,合并等操作,看来这是源码管理工具的基本操作. 1. Git是分布式的,SVN是集中式的,好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后 ...

  6. CSS 笔记五(Combinators/Pseudo-classes/Pseudo-elements)

    CSS Combinators Four different combinators in CSS3 descendant selector (space) child selector (>) ...

  7. size_t总结

    1.sizeof返回的必定是无符号整形,在标准c中通过 typedef 将返回值类型定义为size_t. 若用printf输出size_t类型时,C99中定义格式符%zd;若编译器不支持可以尝试%u或 ...

  8. NodeJS的安装

    1. 进入官网下载对应版本的nodejs(我选择的是32位的window7版本x86) 2. 默认路径可修改   3. install就可以安装在cmd中输入path查看路径(我的是E:\compan ...

  9. 对于JQuery的一些见解

    jQuery是什么?(了解)  www.github.com jQuery 其实就是一堆的js函数,是普通的js,只不过应用广泛,形成了行业标准. 参考书:锋利的jQuery 学习参考:http:// ...

  10. laravel框架总结(七) -- 数据库操作

      1.使用DB门面进行基本操作 一旦你设置好了数据库连接,就可以使用 DB facade 来进行查找.DB facade 提供每个类型的查找方法:select.update.insert.delet ...