自定义N维空间数组
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维空间数组的更多相关文章
- 自定义泛型N维空间数组
class Space<T> : IEnumerable<Space<T>> { public T Filler { get { if (!ed) { ed = t ...
- C 二维数组,以及自定义二维数组
C 二维数组,以及自定义二维数组 我们通常情况下是这样定义一个二维数组的: int a[10][15]; 我们分别查看一下a,a[0],*a 都是一样的值吧 我们可以这么理解: a是一个数组的数组 a ...
- Android生成自定义二维码
前面说过两种二维码扫描方式,现在说如何生成自定义酷炫二维码.二维码生成需要使用Google开源库Zxing,Zxing的项目地址:https://github.com/ZBar/ZBar,我们只需要里 ...
- 分配一维动态数组or 二维动态数组的方法以及学习 new 方法or vector
先来个开胃菜 // 使用new动态分配存储空间 #include<iostream> using std::cout; int main() { // 第1种方式 int *a=new i ...
- [转载]C++二维动态数组memset()函数初始化
来源:https://blog.csdn.net/longhopefor/article/details/20994919 先说说memset函数: void *memset(void *s,int ...
- PHP二维关联数组的遍历方式
采用foreach循环对二维索引数组进行遍历,相对来讲速度更快,效率更高,foreach循环是PHP中专门用来循环数组的.实例也相对简单,多加练习,想清楚程序运行逻辑即可. <?php $arr ...
- javascript 二维(多维)数组的复制问题
最近在项目中遇到一个动画暂停的效果,需要在动画停止的时候检测当前坐标和已经运行的时间,从而调节时间轴为再次运行时加速. 但是在数组保存方面折腾了半天. var orbitArray = [], lin ...
- C语言中二维字符数组的定义和初始化
本篇日志关于二维字符数组的定义和初始化.我相信这篇文章属于菜鸟级的,高手请直接无视. 一般来说,我们可能会希望定义一个二维字符数组并且在定义的时候就用一些字符串来初始化它.比如说: ][MAX_LEN ...
- C++ 指针二维数组, C++二维指针数组笔记
C++ 二维动态数组 一. 已知第一维 #include <iostream> using namespace std; int main(int argc, char const *ar ...
随机推荐
- Python基础、文件处理
一.概述 Python中操作文件是通过file对象来处理的,步骤: 指定文件的路径.操作的模式 对文件进行操作,读或写操作 关闭文件对象 f = open( '文件路径','访问模式') # 打开文件 ...
- CAS无锁算法与ConcurrentLinkedQueue
CAS:Compare and Swap 比较并交换 java.util.concurrent包完全建立在CAS之上的,没有CAS就没有并发包.并发包借助了CAS无锁算法实现了区别于synchroni ...
- 献给初学者:谈谈如何学习Linux操作系统
本文出自 “技术成就梦想” 博客,请务必保留此出处http://ixdba.blog.51cto.com/2895551/569329. 为了能把这篇不错的文章分享给大家.所以请允许我暂时用原创的形式 ...
- BJFU 1057
描述 斐波那契额数列,我们都知道.现在qingyezhu想求斐波那契的某项值对2的某次方的结果.你可以帮一下他吗?他好可怜哦!计算了N的N次方次都错了,也挨了ben大哥的N的N次方次的训了.我想你是个 ...
- AJAX-----15HTML5实现进度条上传
目的当然还是为了提高用户的体验度嘛,, 废话不多说走码.... <!DOCTYPE html> <html lang="en"> <head> ...
- SQL中 Left Join 与 Right Join 与 Inner Join 与 Full Join的区别
首先看看Left Join 与Right Join 与 Inner Join 与 Full Join对表进行操作后得到的结果. 在数据库中新建两张表,并插入要测试的数据. 新建表: GO /***** ...
- Java运行环境的配置
Make sure you do not use the trailing semicolon: This will not work: set JAVA_HOME=C:\Program Files ...
- 配置文件之SharedPreferences
新建配置文件类 /** * Created by RongGuang * 应用程序配置信息 */ public class AppOption { public static final String ...
- 50个常用的JQuery代码
1. 如何创建嵌套的过滤器 //允许你减少集合中的匹配元素的过滤器, //只剩下那些与给定的选择器匹配的部分.在这种情况下, //查询删除了任何没(:not)有(:has) //包含class为“se ...
- MVC5 + EF6 入门完整教程二
从前端的UI开始 MVC分离的比较好,开发顺序没有特别要求,先开发哪一部分都可以,这次我们主要讲解前端UI的部分. ASP.NET MVC抛弃了WebForm的一些特有的习惯,例如服务器端控件,Vie ...