自定义泛型N维空间数组
class Space<T> : IEnumerable<Space<T>> {
    public T Filler {
        get {
            if (!ed) {
                ed = true;
                return (filler = Top.create());
            }
            return filler;
        }
    }
    public Space<T> Upper { get; private set; }
    public Space<T> Top => Upper?.Top ?? this;
    private bool ed;
    private Func<T> create;
    private T filler;
    public int[] Chain { get; set; }
    public int[] Dementions { get; }
    Space<T>[] all;
    public Space(Func<T> 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<T>[i];
        var chains = Enumerable.Range(, i).Select(e => chain.Concat(new int[] { e }).ToArray()).ToArray();
        if (indexes.Length == ) {
            while (i-- > ) {
                all[i] = new Space<T>(chains[i]);
                all[i].Upper = this;
            }
        } else {
            var _indexes = indexes.Skip().ToArray();
            while (i-- > ) {
                all[i] = new Space<T>(chains[i], _indexes);
                all[i].Upper = this;
            }
        }
    }
    private Space(int[] chain) {
        Chain = chain;
    }
    public Space<T> this[int i, params int[] indexes] {
        get {
            if (all == null) {
                return (Filler as Space<T>)?[i, indexes];
            }
            if (indexes.Length == ) {
                return all[i];
            }
            if (indexes.Length == ) {
                return all[i][indexes[]];
            }
            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<T>> GetEnumerator() {
        return ((IEnumerable<Space<T>>)all).GetEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator() {
        return ((IEnumerable<Space<T>>)all).GetEnumerator();
    }
}
自定义泛型N维空间数组的更多相关文章
- 自定义N维空间数组
		class Space : IEnumerable<Space> { public object Filler { get { return filler ?? (filler = Top ... 
- typescript多维对象数组仿List泛型
		定义对象: namespace entity{ export class MyClass{ public value:number; public rect:string; public constr ... 
- java JDK8 学习笔记——第18章 自定义泛型、枚举与注释
		第十八章 自定义泛型.枚举与注释 18.1 自定义泛型 泛型定义: (1)仅定义在方法上的泛型语法 (2)用来限制泛型可用类型的extends与super关键字(3)?类型通配字符的使用 18.1.1 ... 
- .NET基础之自定义泛型
		在.NET中泛型使用非常频繁,在控制台应用程序中,默认的引入了System.Collection.Generics名称空间,其中就提供了我们经常使用的泛型:List<T>和Dictiona ... 
- net 自定义泛型那点事
		泛型概述 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化 ... 
- 分配一维动态数组or 二维动态数组的方法以及学习  new 方法or vector
		先来个开胃菜 // 使用new动态分配存储空间 #include<iostream> using std::cout; int main() { // 第1种方式 int *a=new i ... 
- Net is as typeof 运行运算符详解     net 自定义泛型那点事
		Net is as typeof 运行运算符详解 概述 在了解运行运算符的前提我们需要了解什么是RTTI ,在任何一门面向对象的语言中,都有RTTI这个概念(即 运行时). RTTI(Run-Ti ... 
- [转载]C++二维动态数组memset()函数初始化
		来源:https://blog.csdn.net/longhopefor/article/details/20994919 先说说memset函数: void *memset(void *s,int ... 
- JAVA基础_自定义泛型
		泛型的来源 在Java中,泛型借鉴了C++的模版函数,从而引入了泛型. C++泛型 int add(int x,int y){ return x + y; } float add(float x.fl ... 
随机推荐
- 谨慎使用多线程中的fork
			// Upon successful completion, pthread_atfork() shall return a value of zero; otherwise, an error nu ... 
- oracle分层查询中的start with和connect by(树结构查询)
			来源: http://blog.csdn.net/itmyhome1990/article/details/16338637 ORACLE是一个关系数据库管理系统,它用表的形式组织数据,在某些表 ... 
- google bookmarket api
			引用: 最近做了google书签同步的模块,发现google并没有公开bookmark相关的api接口,在网上也找了些资料,通过自己抓包分析,测试,总结下使用bookmark接口的心得,我是在andr ... 
- 基于eBox的LTC1446驱动
			LTC1446 是linear出品的双通道12bit轨对轨DAC芯片,采用SPI接口,内部基准电压,满量程输出4.095v,单电源供电(4.5-5v).8Pin封装. 使用时非常 ... 
- 使用uiautomator做UI测试
			转载~~~~~~~~~~~~~~~~~~~~~~~~ 若有侵权,请及时联系本博主,博主将第一时间撤销 在Android 4.1发布的时候包含了一种新的测试工具–uiautomator,uiautoma ... 
- 从简单需求到OLAP的RANK系列函数
			同事问了一个非常简单的问题,怎么取出每个partition里面另外一个列的最小值? create table t1 (int c1, int c2); 假如按照c2分区,0-10,10-20,20 ... 
- JVM监控与调优
			目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例 转:http://www.cnblogs.com/zhguang/p/java-jvm-gc.html光说不练假把式,学习J ... 
- [转] ubuntu开启SSH服务
			点击阅读原文 SSH分客户端openssh-client和openssh-server如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有则sudo ... 
- [转]为何需要调用“super viewDidLoad
			转载地址:http://liwpk.blog.163.com/blog/static/36326170201165104413314/ - (void)didReceiveMemoryWarnin ... 
- Internship-ZOJ2532(网络流求割边)
			Internship Time Limit: 5 Seconds Memory Limit: 32768 KB CIA headquarter collects data from acro ... 
