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

 

posted @ 2018-03-20 16:22  zhaogaojian  阅读(695)  评论(0编辑  收藏  举报