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>(); }