.NET C# 保持List<T>有序:自带排序功能的List<T>

1.工具类

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

namespace Infrastructure
{
    /// <summary>
    /// 自带排序功能的List
    /// T为简单类型时,系统已代为实现ICompareable<T>接口,
    /// T为自定义复杂类型时,需要手动实现ICompareable<T>接口
    /// </summary>
    /// <typeparam name="T">泛型类型</typeparam>
    public class SortedList<T>:List<T>
    {
        /// <summary>
        /// 自带排序功能的添加方法
        /// </summary>
        /// <param name="item">数据项</param>
        public new void Add(T item)//new 显式隐藏从基类继承过来的方法,进行重写方法时用到
        {
            int position = this.BinarySearch(item);
            if (position < 0)
            {
                position = ~position;//按位取反,获取项应插入集合的位置
            }

            this.Insert(position,item);
        }

        /// <summary>
        /// 自带排序功能的修改方法
        /// </summary>
        /// <param name="item">新数据项</param>
        /// <param name="index">被修改数据项的位置下标</param>
        public void ModifySorted(T item, int index)
        {
            this.RemoveAt(index);

            int position = this.BinarySearch(item);
            if (position < 0)
            {
                position = ~position; //按位取反,获取项应插入集合的位置
            }

            this.Insert(position,item);
        }

        //List<T>的删除方法不会干扰剩余数据项的排序顺序,所以不需要重写
    }
}
2.功能测试

//简单类型测试
            SortedList<int> intSortedList = new SortedList<int>();

//添加元素
            intSortedList.Add(200);
            intSortedList.Add(20);

            intSortedList.ForEach(Console.WriteLine);

//修改元素

intSortedList.ModifySorted(0, 1);
            intSortedList.ModifySorted(1, 0);

intSortedList.ForEach(Console.WriteLine);

//复杂类型测试

public class Student: IComparable<Student>//自定义复杂类型,如果想要使用List<T>的比较器,必须要继承IComparable<T>接口
    {
        /// <summary>
        /// 班级编号
        /// </summary>
        public int ClassNo { get; set; }
        /// <summary>
        /// 学号
        /// </summary>
        public int StudentNo { get; set; }
        /// <summary>
        /// 姓名
        /// </summary>
        public string StudentName { get; set; }
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set; }

        /// <summary>
        /// 比较方法规则
        /// </summary>
        public int CompareTo(Student obj)
        {
            return this.StudentNo.CompareTo(obj.StudentNo);
        }
    }

//添加

SortedList<Student> stuSortedList = new SortedList<Student>();
            for (int i = 0; i < 10; i++)
            {
                var stu = new Student();
                stu.ClassNo = i;
                stu.StudentNo = i;
                stu.StudentName = "三毛" + i;
                stu.Age = i;
                
                stuSortedList.Add(stu);
            }

            stuSortedList.ForEach(x => Console.WriteLine("ClassNo={0},StudentNo={1},StudentName={2},Age={3}",x.ClassNo,x.StudentNo,x.StudentName,x.Age));

//修改

for (int i = 0; i < 5; i++)
            {
                var stu = new Student();
                stu.ClassNo = 20 + i;
                stu.StudentNo = 20 + i;
                stu.StudentName = "胡三" + (20+ i);
                stu.Age = 20 + i;

                stuSortedList.ModifySorted(stu,i+1);
            }

            stuSortedList.ForEach(x => Console.WriteLine("ClassNo={0},StudentNo={1},StudentName={2},Age={3}", x.ClassNo,x.StudentNo, x.StudentName, x.Age));

posted @ 2019-10-25 18:56  jeff151013  阅读(1774)  评论(0编辑  收藏  举报