自定义泛型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 ...
随机推荐
- kubernetes 1.3 的安装和集群环境部署
简介: Docker:是一个开源的应用容器引擎,可以为应用创建一个轻量级的.可移植的.自给自足的容器. Kubernetes:由Google开源的Docker容器集群管理系统,为容器化的应用提供资源调 ...
- pptp记录日志
/etc/ppp/ip-up #!/bin/bash # This file should not be modified -- make local changes to # /etc/ppp/ip ...
- 深入理解Android之Gradle
深入理解Android之Gradle 格式更加精美的PDF版请到:http://vdisk.weibo.com/s/z68f8l0xTYrZt 下载 Gradle是当前非常"劲爆" ...
- ftp 530 This FTP serveris anonymous only,
引用:http://blog.sina.com.cn/s/blog_7e16680c01018ox1.html 三.遇到的问题 1.只允许匿名用户登录 现象:ftp连接过程中,提示输入用户名,输入本机 ...
- JSP-10-JSTL标准标签库
JSTL (jsp 标准标签库) 包含用于编写和开发JSP页面的一组标准标签,它可为用户提供一个无脚本的环境. JSTL 提供了4个主要的标签库: 核心标签库.国际化(I18N)与格式化标签库.XML ...
- 导入maven工程遇见的问题【问题】
原工程是一个基于websocket的maven工程(源工程:http://www.cnblogs.com/xdp-gacl/p/5193279.html),把工程导入eclipse后报错.
- 腾讯数据总监:运营人员必须掌握的APP基础数据分析体系(没有比这篇更系统全面的)
导读:在互联网企业,任何一个APP都要事先规划好数据体系,才允许上线运营,有了数据才可以更好的科学运营.因此本文将为大家介绍APP的基础数据指标体系.主要分为五个维度,包括用户规模与质量.参与度分析. ...
- PHP中怎样创建一个空对象?
如果没有声明一个对象然后就对其属性赋值会出现警告.那么我们给它创建一个空对象然后赋值就好了.PHP中创建一个空对象代码如下: 第一种方式: $empty_object = new stdClass() ...
- Object类型与Array类型
总结--JS中的引用类型: Object类型,Array类型,Boolean类型,Number类型,String类型,Date类型, Function类型,RegExp类型,单体内置对象(Global ...
- python-判断系统平台
1.windows 2.linux 总结 python提供了sys,os及platform等个模块读取平台信息,客官可以根据自己的喜好选择使用