在日常开发中,数据集合是我们必不可少的重要工具之一。在C#中,.Net Framework也为我们提供了种类繁多,功能多样的数据集工具。在此,我基于List<T> 和 HashTable制作了一个功能强大的数据集,我将其命名为HashList。他集二者的优势于一身,既支持数组索引的操作,同时也支持键值对操作。我更在此基础上封装了一些常用的工具函数,使其能够极大的方便我们日常开发中的数据管理。
HashList 核心功能如下:
1、类型安全的数据集合,省去了强制转换的繁冗操作
2、根据数组索引,哈希键值来添加,删除,读取数据
3、从序列的指定索引处截取指定长度
4、使用实现了ICompare接口的排序类进行排序
5、查找指定谓语条件的一组数据或单个数据
6、连接两个HashList数据集
不足之处:
1、原本打算使用双向链接表来替代List<T>,但是发现LinkedList无法实现数据集的过滤和排序,所以不得已又换回了了List<T>。如果哪位大神知道双向连接表的过滤和排序实现方法,还请不吝赐教。
2、由于C#是强类型语言,所以某些操作,特别是删除操作,对于HashList中的HashTable部分就显得比较困难,因为我无法去动态获取对象的key属性。(当然,反射可以做到,但是由于它的效率较低,所以我不打算使用)。目前实现的方法就是在HashTable中遍历比较,然后再删除。如果哪位大神有更好的方法,请不吝赐教。
另外,本代码中对于对象的打印使用的是Jayrock。
以下源码及Jayrock下载地址,请点这里。
废话少说,直接上源码:
HashList.cs
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System;
using UnityEngine;
//************************************************************************************
//* 命名空间:xyxk;
//* 版本号: V1.0.0.0;
//* 创建人: 枫叶天空 (孙伟航);
//* QQ : 1569423066;
//* 电子邮箱:SunixSky@gmail.com
//* 创建时间:2014-06-14;
//* 描述 : 功能强大的自定义集合,同时兼容list与hashtable的核心功能;
//*************************************************************************************
namespace xyxk
{
/// <summary>
/// 哈希列表;
/// </summary>
public class HashList<T> : IDisposable
{
//哈希表对象,用来进行键值数据处理;
public Hashtable hash = new Hashtable();
//泛型列表,用来进行有序数据处理;
public List<T> list = new List<T>();
//字符串格式化标志;
//true 打印list;
//false 打印hashTabel;
public bool typeList = true;
/// public method
/// <summary>
/// 获取一个Array结构的数据集;
/// </summary>
/// <returns></returns>
public T[] array
{
get
{
T[] array = new T[count];
list.CopyTo(array);
return array;
}
}
/// <summary>
/// 从当前列表中指定的索引位置处截取num个对象,并返回;
/// </summary>
/// <param name="start">截取的起始索引</param>
/// <param name="num">截取数量</param>
/// <returns></returns>
public List<T> splice(int start, int num)
{
T[] array = new T[num];
list.CopyTo(start,array,0,num);
removeFromHashByArray(array);
return array.ToList();
}
/// <summary>
/// 连接两个hashList;
/// </summary>
/// <param name="value"></param>
public void concat(HashList<T> value)
{
list = list.Concat(value.list).ToList(); ;
addFromHash(value.hash);
}
/// <summary>
/// 通过键值添加对象;
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void addElement(object key, T value)
{
list.Add(value);
hash.Add(key, value);
}
/// <summary>
/// 向指定的索引处添加对象;
/// </summary>
/// <param name="value"></param>
/// <param name="index"></param>
public void addElement(object key, T value, int index)
{
list.Insert(index, value);
hash.Add(key, value);
}
/// <summary>
/// 获取指定索引处的对象;
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public T getElement(int index)
{
return list.ElementAtOrDefault(index);
}
///