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维空间数组的更多相关文章

  1. 自定义N维空间数组

    class Space : IEnumerable<Space> { public object Filler { get { return filler ?? (filler = Top ...

  2. typescript多维对象数组仿List泛型

    定义对象: namespace entity{ export class MyClass{ public value:number; public rect:string; public constr ...

  3. java JDK8 学习笔记——第18章 自定义泛型、枚举与注释

    第十八章 自定义泛型.枚举与注释 18.1 自定义泛型 泛型定义: (1)仅定义在方法上的泛型语法 (2)用来限制泛型可用类型的extends与super关键字(3)?类型通配字符的使用 18.1.1 ...

  4. .NET基础之自定义泛型

    在.NET中泛型使用非常频繁,在控制台应用程序中,默认的引入了System.Collection.Generics名称空间,其中就提供了我们经常使用的泛型:List<T>和Dictiona ...

  5. net 自定义泛型那点事

    泛型概述 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化 ...

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

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

  7. Net is as typeof 运行运算符详解 net 自定义泛型那点事

    Net is as typeof 运行运算符详解   概述 在了解运行运算符的前提我们需要了解什么是RTTI ,在任何一门面向对象的语言中,都有RTTI这个概念(即 运行时). RTTI(Run-Ti ...

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

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

  9. JAVA基础_自定义泛型

    泛型的来源 在Java中,泛型借鉴了C++的模版函数,从而引入了泛型. C++泛型 int add(int x,int y){ return x + y; } float add(float x.fl ...

随机推荐

  1. docker入门的文章

    PART 1: OVERVIEW OF MICROSERVICE ARCHITECTURE & CONTAINERIZATION PART II: GETTING SET-UP AND STA ...

  2. LuaSocket http笔记

    LuaSocket 基于Lua平台开发的一套socket的lua接口库程序, 为lua程序的扩展 ,http://w3.impa.br/~diego/software/luasocket/home.h ...

  3. Force StyleCop to Ignore a File

    You can quickly force StyleCop to ignore files in a project by manually modifying the project file, ...

  4. [翻译] java NIO Channel

    原文地址:http://tutorials.jenkov.com/java-nio/channels.html JAVA NIO channels和流的概念很像,下面是他们的一些区别: 你可以对cha ...

  5. jq 解析josn字符串

    1. var obj = jQuery.parseJSON("${ruleModel.rules}"); 2. var obj = eval("("+" ...

  6. checkbox实现单选,全选,反选,取消选

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  7. Azure web role, work role 以及其他role

    Azure web role, work role 以及其他role 如果没有创建过web role 和work role的话可以参考如下文章来创建一下web role 和work role. htt ...

  8. 161216、使用spring的DefaultResourceLoader自定义properties文件加载工具类

    import java.io.IOException; import java.io.InputStream; import java.util.NoSuchElementException; imp ...

  9. [poj2828] Buy Tickets (线段树)

    线段树 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must ...

  10. 四大开源协议比较:BSD、Apache、GPL、LGPL (转)

    转自:http://www.lupaworld.com/portal.php?mod=view&aid=205552&page=all 本文参考文献:http://www.fsf.or ...