• 动态字段列表实现及List<T>排序


    public class StudentCardSortHelper<T>
    {
      //itemName 要排序的字段名
        public static List<StudentCard> SortByCardItem(string itemName, SortOrder sortOrder, List<StudentCard> ListItemData)
        {
    
            List<KeyValueData<T>> sd = new List<KeyValueData<T>>();
            List<StudentCard> returnList = new List<StudentCard>();
            for (int i = 0; i < ListItemData.Count; i++)
            {
                var v = ListItemData[i].StudentCardItems.Find(c => c.Name.Equals(itemName));
                if (typeof(T)==typeof(int))
                {
                    object obj = String.IsNullOrEmpty(v.Text)?int.MinValue:Convert.ToInt32(v.Text);
                    sd.Add(new KeyValueData<T>((T)obj, ListItemData[i]));
                }
                else
                {
    
                    object obj = v.Text;
                    sd.Add(new KeyValueData<T>((T)obj, ListItemData[i]));
                }
            }
    
            if (sortOrder == SortOrder.Ascending)//升序
            {
                List<KeyValueData<T>> list = sd.OrderBy(c => c.key).ToList<KeyValueData<T>>() ;
                foreach (var item in list)
                {
                    returnList.Add(item.StudentCard);
                }
            }
            else//降序
            {
                List<KeyValueData<T>> list = sd.OrderByDescending(c => c.key).ToList<KeyValueData<T>>();
                foreach (var item in list)
                {
                    returnList.Add(item.StudentCard);
                }
            }
            ListItemData = returnList;
            return ListItemData;
    
        }
        //key可重复
        public class KeyValueData<T>
        {
            public T key;
            public StudentCard StudentCard;
    
            public KeyValueData(T key, StudentCard StudentCard)
            {
                this.key = key;
                this.StudentCard = StudentCard;
            }
    
        }
    }

    使用方法,其中不同列的原始数据都是string类型,但是年龄之类直接按string排序会出问题,所以改成列类型自动判断,ListItemData为未排序前的学生卡片列表。

    if (v.ItemDataType == DataType.TYPE_NUMBER)
    {
        ListItemData = StudentCardSortHelper<int>.SortByCardItem(itemName, sortOrder,ListItemData);
    }
    else
    {
        ListItemData = StudentCardSortHelper<String>.SortByCardItem(itemName,sortOrder, ListItemData);
    }

    以下是各个类型定义

    public enum DataType
    {
        TYPE_STRING,
        TYPE_NUMBER
    }
    //数据列表
    public List<StudentCard> ListItemData = new List<StudentCard>();
    public class CardItem
    {
        private String name;//名称
        private String text;//显示文本
        private DataType itemDataType;//数据类型
      {..getset..}
    }

     字段个数是动态的。

    public class StudentCard
    {
      public List<CardItem> StudentCardItems { get; set; } = new List<CardItem>();
    }
  • 相关阅读:
    Lua弱引用table
    Javascript定义类(class)的三种方法
    双检锁技术
    【翻译】ASP.NET缓存管理
    socket python
    mvc项目
    MSBuild
    阅读glibc源码
    MVC3使用Unity实现依赖注入接口与于实现类自动注册
    C# 指针之美
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/8609999.html
Copyright © 2020-2023  润新知