随笔 - 163  文章 - 2  评论 - 370  阅读 - 46万 
今天模拟了一个主键带有二个值的类,也是为了对C#数据结构的加深,其实用HashTable通过合拼字符串传进去也可以,出来时再拆分并且效率更高,不过我这个是反过来,分散传进来,合拼传出来,完全是为了让大家知道,C#数据结构的重要性,不学之前你只会用ArrayList, HashTable,但你学过后,你就知道他们实现的原理.
复制代码
    public class ThreeHashTable
    {
        
private object[] Key;     //键值
        private object[] Value1;  //值1
        private object[] Value2;  //值2
        private long maxLength;       //最大元素个数
        private long length;          //已经占用的长度

        
public ThreeHashTable()
            : 
this(32)
        { }

        
/// <summary>
        
/// 构造ThreeHashTable
        
/// </summary>
        
/// <param name="capacity"></param>
        public ThreeHashTable(long capacity)
        {
            
this.length = -1;      //初始时赋值为-1
            this.maxLength = capacity;    //设置最大容量
            this.Key = new object[capacity];
            
this.Value1 = new object[capacity];
            
this.Value2 = new object[capacity];
        }

        
/// <summary>
        
/// 取最大长度
        
/// </summary>
        public long Length
        {
            
get { return (this.length + 1); }
        }

        
/// <summary>
        
/// 返回或设置ThreeHashTable的最大元素个数
        
/// </summary>
        public long MaxLength
        {
            
get 
            {
                
return this.maxLength; 
            }
        }

        
/// <summary>
        
/// 是否已经填满,满返回true,否则返回false
        
/// </summary>
        
/// <returns></returns>
        public bool Full()
        {
            
return ((this.length + 1>= this.maxLength);  //length+1不为最大会值时就还没有填满,因为length初始化是-1,而且是从0开始
        }

        
/// <summary>
        
/// 是否为空,空返回true,否则返回false
        
/// </summary>
        
/// <returns></returns>
        public bool Empty()
        {
            
return (this.length == -1);   //当没有元素存在,length为-1
        }

        
/// <summary>
        
/// 是否存在键值,存在返回true,否则返回false
        
/// </summary>
        
/// <param name="key"></param>
        
/// <returns></returns>
        private bool ExistsKey(object key)
        {
            
for (long i = 0; i <= this.length; i++)
            {
                
if (key.ToString() == this.Key[i].ToString())
                {
                    
return true;
                }
            }
            
return false;
        }

        
/// <summary>
        
/// 插入值到ThreeHashTable
        
/// </summary>
        
/// <param name="key">Object Type</param>
        
/// <param name="value1">Object Type</param>
        
/// <param name="value2">Object Type</param>
        public void Add(object key, object value1, object value2)
        {
            
if (Full())
            {
                
throw new ArgumentOutOfRangeException("ThreeHashTable已经满员,请扩大容量");
            }
            
if (key == null || value1 == null || value2 == null)
            {
                
throw new ArgumentOutOfRangeException("key或值为null或还没有初始化");
            }
            
if (!ExistsKey(key))
            {
                
if (this.Key == null)
                    key 
= new object[this.maxLength];
                
if (this.Value1 == null)
                    Value1 
= new object[this.maxLength];
                
if (this.Value2 == null)
                    Value2 
= new object[this.maxLength];

                
this.Key[++length] = key;
                
this.Value1[length] = value1;
                
this.Value2[length] = value2;
            }
        }

        
/// <summary>
        
/// 清除ThreeHashTable所有元素
        
/// </summary>
        public void Clear()
        {
            
this.length = -1;
            
this.Key = null;
            
this.Value1 = null;
            
this.Value2 = null;
        }

        
/// <summary>
        
/// 返回key所在的位置
        
/// </summary>
        
/// <param name="key"></param>
        
/// <returns></returns>
        private long KeyIndex(object key)
        {
            
long index = 0;
            
for (long i = 0; i < this.length; i++)
            {
                
if (key.ToString() == this.Key[i].ToString())
                {
                    index 
= i;
                    
break;
                }
            }
            
return index;
        }

        
/// <summary>
        
/// 通过key来取得值,返回object数组
        
/// </summary>
        
/// <param name="key">ThreeHashTable项的key</param>
        
/// <param name="value">返回一个包含值的数组,得到数组后,用value[0]和value[1]取值</param>
        
/// <returns></returns>
        public object[] GetKeyValue(object key, object[] value)
        {            
            
if (Empty())
            {
                
throw new ArgumentOutOfRangeException("ThreeHashTable没有填充元素为空");
            }
            
if (!ExistsKey(key))
            {
                
throw new ArgumentOutOfRangeException("键值不存在");
            }
            
else
            {
                value 
= new object[2];
                
long index = KeyIndex(key);
                value[
0= this.Value1[index];
                value[
1= this.Value2[index];
            }
            
return value;
        }

        
/// <summary>
        
/// 通过key来取得值,返回以传进line隔开的字符串
        
/// </summary>
        
/// <param name="key"></param>
        
/// <param name="line">这个参数很重要,是区分二个值的分隔符,不能最好能用多几个特殊组合字符串</param>
        
/// <returns></returns>
        public string GetKeyValue(object key,string line)
        {
            
string value = "";
            
if (Empty())
            {
                
throw new ArgumentOutOfRangeException("ThreeHashTable没有填充元素为空");
            }
            
if (!ExistsKey(key))
            {
                
throw new ArgumentOutOfRangeException("键值不存在");
            }
            
else
            {
                
long index = KeyIndex(key);
                value 
= this.Value1[index].ToString() + line + this.Value2[index].ToString();
            }
            
return value;
        }

        
/// <summary>
        
/// 从ThreeHashTable移除一个项
        
/// </summary>
        
/// <param name="key"></param>
        public void ReMove(object key)
        {
            
if (Empty())
            {
                
throw new ArgumentOutOfRangeException("ThreeHashTable没有填充元素为空");
            }

            
if (!ExistsKey(key))
            {
                
throw new ArgumentOutOfRangeException("键值不存在");
            }
            
else
            {
                
long index = KeyIndex(key);
                
this.Key[index] = null;
                
this.Value1[index] = null;
                
this.Value2[index] = null;
            }
        }
    }
复制代码

测试代码:

复制代码
try
            { 
                ThreeHashTable tht 
= new ThreeHashTable(10);
                Console.WriteLine(
"-------初始化各参数列表-------");
                Console.WriteLine(
"现在已经有元素个数:" + tht.Length);
                Console.WriteLine(
"元素总数最大值:" + tht.MaxLength);
                Console.WriteLine(
"是否为空:" + tht.Empty().ToString());
                Console.WriteLine(
"是否填满:" + tht.Full().ToString());

                
for (int i = 0; i < 10; i++)
                {
                    tht.Add(i, 
"B" + i.ToString(), "C" + i.ToString());
                }
                Console.WriteLine(
"-------添加元素参数列表-------");
                Console.WriteLine(
"现在已经有元素个数:" + tht.Length);
                Console.WriteLine(
"元素总数最大值:" + tht.MaxLength);
                Console.WriteLine(
"是否为空:" + tht.Empty().ToString());
                Console.WriteLine(
"是否填满:" + tht.Full().ToString());
                Console.WriteLine(
"-------取值方法一返回数组-------");
                
object[] a = new object[2];
                a 
= tht.GetKeyValue("1", a);
                
object value1 = a[0];
                
object value2 = a[1];
                Console.WriteLine(
"value1:  " + value1);
                Console.WriteLine(
"value2:  " + value2);
                Console.WriteLine(
"-------取值方法二返回字符串-------");
                
string value = tht.GetKeyValue("1""|");
                Console.WriteLine(
"value:  " + value);
                Console.WriteLine(
"-------移除一个元素-------");
                tht.ReMove(
1);
                tht.Clear();
                Console.WriteLine(
"-------清除所有元素-------");
                Console.WriteLine(
"现在已经有元素个数:" + tht.Length);
                Console.WriteLine(
"元素总数最大值:" + tht.MaxLength);
                Console.WriteLine(
"是否为空:" + tht.Empty().ToString());
                Console.WriteLine(
"是否填满:" + tht.Full().ToString());
                Console.ReadLine();
            }
            
catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
复制代码

结果:
posted on   风浪  阅读(1063)  评论(5编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示