【C#】19. Set、Dictionary创设AssocArray

【C#】19. Set、Dictionary创建AssocArray

创建AssocArray的目的是关联数据和主键:例如"A1" ~ 1; "B1" ~ 2.08 ...

其中,Set是自定义的数据结构,内部含有dictionary数据,可以进行诸如合并,交集等的操作。

【C#】19. Set、Dictionary创设AssocArray【C#】19. Set、Dictionary创设AssocArray

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;

namespace FinMktReverseEngineering
{
    //1.    Set
    #region Set 类型
    public class Set<T> : IEnumerable<T>
    {
        //  成员
        protected Dictionary<T, int> dict;

        //构造器1
        public Set()
        {   
            dict = new Dictionary<T, int>();
        }
        //构造器2
        public Set(Set<T> set)
        {
            dict = new Dictionary<T, int>();
            foreach (T key in set.dict.Keys)
            {
                dict[key]=0;
            }
        }

        //GetEnumerator迭代器
        IEnumerator<T> IEnumerable<T>.GetEnumerator()
        {
            foreach (KeyValuePair<T, int> item in dict)
            {
                yield return item.Key;
            }
        }
        //   【修改】
        IEnumerator IEnumerable.GetEnumerator()
        {
            foreach (KeyValuePair<T, int> item in dict)
            {
                yield return item.Key;
            }
        }

        //Insert方法
        public void Insert(T key) 
        { 
            dict[key]=0;
        }
        //Remove方法
        public void Remove(T key)
        {
            dict.Remove(key);
        }
        //Contains方法
        public bool Contains(T key)
        {
            if (dict.ContainsKey(key))
            {
                return true;
            }
            else return false;
        }
        //Replace方法
        public void Replace(T key1,T key2)
        {
            foreach (T key in dict.Keys)
            {
                if (key.Equals(key1))
                {
                    Remove(key1);
                    Insert(key2);
                    break;
                }
            }
        }
        //Intersection方法
        public static Set<T> Intersection(Set<T> s1, Set<T> s2)
        {
            Set<T> setIntsec = new Set<T>();
            foreach (T key1 in s1.dict.Keys)
            {
                foreach (T key2 in s2.dict.Keys)
                {
                    if (key1.Equals(key2)) setIntsec.Insert(key1);
                }
            }
            return setIntsec;
        }
        //Union方法
        public static Set<T> Union(Set<T> s1, Set<T> s2)
        {
            Set<T> setUnion = new Set<T>(s1);
            
            foreach (T key2 in s2.dict.Keys)
            {
                setUnion.Insert(key2);
            }
            return setUnion;
        }
        //Difference方法
        public static Set<T> Difference(Set<T> s1, Set<T> s2)
        {
            Set<T> setDiff = new Set<T>(s1);
            foreach (T key1 in s1.dict.Keys)
            {
                foreach (T key2 in s2.dict.Keys)
                {
                    if (key1.Equals(key2))  setDiff.Remove(key1);
                }      
            }
            return setDiff;
        }
        //SymmetricDifference方法
        public static Set<T> SymmetricDifference(Set<T> s1, Set<T> s2)
        {
            Set<T> setSymDiff = Set<T>.Union(s1,s2);
            foreach (T key1 in s1.dict.Keys)
            {
                foreach (T key2 in s2.dict.Keys)
                {
                    if (key1.Equals(key2)) setSymDiff.Remove(key1);
                }
            }
            return setSymDiff;
        }
        //print()方法    
        public void print()
        {
            foreach (KeyValuePair<T,int> item in dict)
            {
                Console.Write("{0}, ", item.Key);
            }
            Console.WriteLine();
        }
        //Size()方法
        public int Size()
        {
            return dict.Count;
        }
        //count属性
        public int count 
        {
            get { return dict.Count; }
        }
        //是否是空集
        public bool IsEmpty
        {
            get { return dict.Count==0?true:false; }
        }
        //两个集合是否相同
        public bool IsEqual(Set<T> newSet)
        {
            if (this.dict.Count!=newSet.count)
            {
                return false;
            }
            else
            {
                foreach (T key in newSet)
                {
                    if (!this.dict.ContainsKey(key)) { return false; }
                }
                return true;
            }
        }
    }
    #endregion

    //2.    AssocArray
    #region AssocArray 类型
    public class AssocArray<Key, Value> : IEnumerable<KeyValuePair<Key, Value>>
    {
        //成员
        Dictionary<Key, Value> str; //这个字典的主键数量可能比Set中的要大。
        Set<Key> keys;

        // 构造器1:Default constructor
        public AssocArray()
        {
            str = new Dictionary<Key, Value>();
            keys = new Set<Key>();
        }
        // 构造器2:Copy constructor
        public AssocArray(AssocArray<Key, Value> arr2)
        {
            str = new Dictionary<Key, Value>(arr2.str);     // Dictionary的copy构造器
            keys = new Set<Key>(arr2.keys);
        }
        // 构造器3:初始化关键字和值
        public AssocArray(Set<Key> keys, Value val)
        {
            this.keys = keys;
            str = new Dictionary<Key, Value>();
            foreach (Key k in this.keys)
            {
                str[k] = val;
            }
        }
        // 构造器4
        public AssocArray(Set<Key> keys, Dictionary<Key, Value> str)
        {
            this.keys = keys;
            this.str = str;
        }

        //this索引
        public Value this[Key k]    //  k in Set keys
        {
            set 
            {
                keys.Insert(k);
                str[k] = value; //str Dictionary      
            }
            get { return str[k]; }
        }
        //Keys Set 属性
        public Set<Key> Keys
        {
            set { this.keys = value; }
            get { return keys; }

        }
        //Dictionary
        public Dictionary<Key,Value> Dict
        {
            set { this.str = value; }
            get { return this.str; }
        }
        //在console中打印
        public void print()
        {
            foreach (Key key in keys)
            {
                if (str.ContainsKey(key))
                {
                    Console.Write("{0}, {1} ", key, str[key]);
                }      
            }
            Console.WriteLine();
        }
        //  返回Dictionary和Set中都有的主键对应的keyvaluepair
        IEnumerator<KeyValuePair<Key, Value>> IEnumerable<KeyValuePair<Key, Value>>.GetEnumerator()
        {
            for (int i = 0; i < this.keys.count; i++)
            {
                yield return this.str.ElementAt(i);
            }
        }
        IEnumerator IEnumerable.GetEnumerator()
        {
            for (int i = 0; i < this.keys.count; i++)
            {
                yield return this.str.ElementAt(i);
            }
        }
    }
    #endregion
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Globalization;

namespace FinMktReverseEngineering
{

    class test
    {

        static void Main(string[] args)
        {
            Set<string> set1 = new Set<string>();
            Dictionary<string, double> dict = new Dictionary<string, double>();
            set1.Insert("A1");
            set1.Insert("A2");
            set1.Insert("A3");
            set1.Insert("A7");
            dict.Add("A1", 1);
            dict.Add("A2", 2);
            dict.Add("A3", 3);
            dict.Add("A4", 4);
            dict.Add("A5", 5);
            dict.Add("A6", 6);
            AssocArray<string, double> arr = new AssocArray<string, double>(set1, dict);
            arr["B1"] = 7;
            arr.print();
            Console.Read();
        }
        }

      
    }