1. class Space<T> : IEnumerable<Space<T>> {
  2. public T Filler {
  3. get {
  4. if (!ed) {
  5. ed = true;
  6. return (filler = Top.create());
  7. }
  8. return filler;
  9. }
  10. }
  11. public Space<T> Upper { get; private set; }
  12. public Space<T> Top => Upper?.Top ?? this;
  13.  
  14. private bool ed;
  15. private Func<T> create;
  16. private T filler;
  17. public int[] Chain { get; set; }
  18. public int[] Dementions { get; }
  19. Space<T>[] all;
  20.  
  21. public Space(Func<T> create, int i, params int[] indexes) : this(new int[], new[] { i }.Concat(indexes).ToArray()) {
  22. this.create = create;
  23. }
  24.  
  25. private Space(int[] chain, params int[] indexes) {
  26. Chain = chain;
  27. Dementions = indexes;
  28. var i = indexes[];
  29. all = new Space<T>[i];
  30. var chains = Enumerable.Range(, i).Select(e => chain.Concat(new int[] { e }).ToArray()).ToArray();
  31. if (indexes.Length == ) {
  32. while (i-- > ) {
  33. all[i] = new Space<T>(chains[i]);
  34. all[i].Upper = this;
  35. }
  36. } else {
  37. var _indexes = indexes.Skip().ToArray();
  38. while (i-- > ) {
  39. all[i] = new Space<T>(chains[i], _indexes);
  40. all[i].Upper = this;
  41. }
  42. }
  43. }
  44.  
  45. private Space(int[] chain) {
  46. Chain = chain;
  47. }
  48.  
  49. public Space<T> this[int i, params int[] indexes] {
  50. get {
  51. if (all == null) {
  52. return (Filler as Space<T>)?[i, indexes];
  53. }
  54. if (indexes.Length == ) {
  55. return all[i];
  56. }
  57. if (indexes.Length == ) {
  58. return all[i][indexes[]];
  59. }
  60. return all[i][indexes[], indexes.Skip().ToArray()];
  61. }
  62. }
  63.  
  64. public override string ToString() {
  65. return all?.Aggregate(string.Empty, (a, s) => a + s + ',').Trim(',') ?? Filler.ToString();
  66. }
  67.  
  68. public override bool Equals(object obj) {
  69. if (GetType() != obj?.GetType()) {
  70. return false;
  71. }
  72. return GetHashCode() == obj.GetHashCode();
  73. }
  74.  
  75. public override int GetHashCode() {
  76. if (Upper == null) {
  77. return base.GetHashCode();
  78. }
  79. return Top.GetHashCode() - Chain.GetHashCode();
  80. }
  81.  
  82. public IEnumerator<Space<T>> GetEnumerator() {
  83. return ((IEnumerable<Space<T>>)all).GetEnumerator();
  84. }
  85.  
  86. IEnumerator IEnumerable.GetEnumerator() {
  87. return ((IEnumerable<Space<T>>)all).GetEnumerator();
  88. }
  89. }

自定义泛型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. kubernetes 1.3 的安装和集群环境部署

    简介: Docker:是一个开源的应用容器引擎,可以为应用创建一个轻量级的.可移植的.自给自足的容器. Kubernetes:由Google开源的Docker容器集群管理系统,为容器化的应用提供资源调 ...

  2. pptp记录日志

    /etc/ppp/ip-up #!/bin/bash # This file should not be modified -- make local changes to # /etc/ppp/ip ...

  3. 深入理解Android之Gradle

    深入理解Android之Gradle 格式更加精美的PDF版请到:http://vdisk.weibo.com/s/z68f8l0xTYrZt 下载 Gradle是当前非常"劲爆" ...

  4. ftp 530 This FTP serveris anonymous only,

    引用:http://blog.sina.com.cn/s/blog_7e16680c01018ox1.html 三.遇到的问题 1.只允许匿名用户登录 现象:ftp连接过程中,提示输入用户名,输入本机 ...

  5. JSP-10-JSTL标准标签库

    JSTL (jsp 标准标签库) 包含用于编写和开发JSP页面的一组标准标签,它可为用户提供一个无脚本的环境. JSTL 提供了4个主要的标签库: 核心标签库.国际化(I18N)与格式化标签库.XML ...

  6. 导入maven工程遇见的问题【问题】

    原工程是一个基于websocket的maven工程(源工程:http://www.cnblogs.com/xdp-gacl/p/5193279.html),把工程导入eclipse后报错.

  7. 腾讯数据总监:运营人员必须掌握的APP基础数据分析体系(没有比这篇更系统全面的)

    导读:在互联网企业,任何一个APP都要事先规划好数据体系,才允许上线运营,有了数据才可以更好的科学运营.因此本文将为大家介绍APP的基础数据指标体系.主要分为五个维度,包括用户规模与质量.参与度分析. ...

  8. PHP中怎样创建一个空对象?

    如果没有声明一个对象然后就对其属性赋值会出现警告.那么我们给它创建一个空对象然后赋值就好了.PHP中创建一个空对象代码如下: 第一种方式: $empty_object = new stdClass() ...

  9. Object类型与Array类型

    总结--JS中的引用类型: Object类型,Array类型,Boolean类型,Number类型,String类型,Date类型, Function类型,RegExp类型,单体内置对象(Global ...

  10. python-判断系统平台

    1.windows 2.linux 总结 python提供了sys,os及platform等个模块读取平台信息,客官可以根据自己的喜好选择使用