动态字段列表实现及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>();
}

 

转载于:https://www.cnblogs.com/zhaogaojian/p/8609999.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值