zoukankan      html  css  js  c++  java
  • 自定义泛型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[0], new[] { i }.Concat(indexes).ToArray()) {
            this.create = create;
        }
    
        private Space(int[] chain, params int[] indexes) {
            Chain = chain;
            Dementions = indexes;
            var i = indexes[0];
            all = new Space<T>[i];
            var chains = Enumerable.Range(0, i).Select(e => chain.Concat(new int[] { e }).ToArray()).ToArray();
            if (indexes.Length == 1) {
                while (i-- > 0) {
                    all[i] = new Space<T>(chains[i]);
                    all[i].Upper = this;
                }
            } else {
                var _indexes = indexes.Skip(1).ToArray();
                while (i-- > 0) {
                    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 == 0) {
                    return all[i];
                }
                if (indexes.Length == 1) {
                    return all[i][indexes[0]];
                }
                return all[i][indexes[0], indexes.Skip(1).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();
        }
    }
  • 相关阅读:
    获取有关控件的坐标
    Android PopupWindow的使用和分析
    Android RecyclerView 使用完全解析 体验艺术般的控件
    TextView中显示价格并且中间直接有一个横线
    Android Studio
    移动开发】Android中三种超实用的滑屏方式汇总(ViewPager、ViewFlipper、ViewFlow)
    Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
    理解Java的IO流 2015年8月6日 21:30:38
    算法导论学习随笔——第七章 快速排序
    oj 1031 random permutation
  • 原文地址:https://www.cnblogs.com/ly45/p/6083491.html
Copyright © 2011-2022 走看看