List 中的元素排序
要求:策划对于列表中显示的内容需要进行排序,比如先按人物等级从高到底,如果等级相同,则按贡献度从高到底,如果贡献度相同,则按id进行排序
实现:
public enum SortType
{None,Ascend,Descend,}public class SortFieldData
{//排序字段的名字public string name;//排序类型public SortType sortType;
}private static int CompareValue<T>(T x, T y, List<SortFieldData> sortFieldList, int index){if (index >= sortFieldList.Count){return 0;}if (sortFieldList[index] == null){return 0;}Type xType = x.GetType();Type yType = y.GetType();FieldInfo xFieldInfo = xType.GetField(sortFieldList[index].name);FieldInfo yFieldInfo = yType.GetField(sortFieldList[index].name);if (xFieldInfo == null || yFieldInfo == null){return 0;}long xValue = 0;long yValue = 0;if (xFieldInfo.FieldType == typeof(long)){long xValue2 = (long)xFieldInfo.GetValue(x);long yValue2 = (long)yFieldInfo.GetValue(y);xValue = xValue2;yValue = yValue2;}else if (xFieldInfo.FieldType == typeof(bool)){bool xBool = (bool)xFieldInfo.GetValue(x);bool yBool = (bool)yFieldInfo.GetValue(y);xValue = xBool ? 1 : 0;yValue = yBool ? 1 : 0;}else{int xValue1 = (int)xFieldInfo.GetValue(x);int yValue1 = (int)yFieldInfo.GetValue(y);xValue = xValue1;yValue = yValue1;}//相等则进入下一层if (xValue == yValue){return CompareValue(x, y, sortFieldList, index + 1);}//不等比较switch (sortFieldList[index].sortType){case SortType.Ascend:{return xValue.CompareTo(yValue);}case SortType.Descend:{return yValue.CompareTo(xValue);}}return 0;}private static void InternalSort<T>(List<T> list, List<SortFieldData> sortFieldList){if (list == null){return;}list.Sort((x, y) =>{return CompareValue(x, y, sortFieldList, 0);});}public static void CustomSort<T>(List<T> list, List<SortFieldData> sortFieldList){if (list == null){return;}if (sortFieldList == null || sortFieldList.Count <= 0){return;}if (sortFieldList[0] == null){return;}//判断是否排序if (!IsSort(list, sortFieldList)){return;}//开始排序switch (sortFieldList[0].sortType){case SortType.Ascend:{InternalSort(list, sortFieldList);sortFieldList[0].sortType = SortType.Descend;}break;case SortType.Descend:{InternalSort(list, sortFieldList);sortFieldList[0].sortType = SortType.Ascend;}break;}}//判断是否应该排序private static bool IsSort<T>(List<T> list, List<SortFieldData> sortFieldList){if (list == null || sortFieldList == null){return false;}//遍历所有字段foreach (SortFieldData item in sortFieldList){if (item != null){if (InternalIsSort(list, item.name)){return true;}}}return false;}//指定字段是否相同private static bool InternalIsSort<T>(List<T> list, string targetName){if (list == null){return false;}for (int i = 0; i + 1 < list.Count; i++){if (list[i] != null && list[i + 1] != null){Type xType = list[i].GetType();Type yType = list[i + 1].GetType();FieldInfo xFieldInfo = xType.GetField(targetName);FieldInfo yFieldInfo = yType.GetField(targetName);if (xFieldInfo == null || yFieldInfo == null){return false;}long xValue = 0;long yValue = 0;if (xFieldInfo.FieldType == typeof(int)){int xValue1 = (int)xFieldInfo.GetValue(list[i]);int yValue1 = (int)yFieldInfo.GetValue(list[i + 1]);xValue = xValue1;yValue = yValue1;}else if (xFieldInfo.FieldType == typeof(long)){long xValue2 = (long)xFieldInfo.GetValue(list[i]);long yValue2 = (long)yFieldInfo.GetValue(list[i + 1]);xValue = xValue2;yValue = yValue2;}else if (xFieldInfo.FieldType == typeof(bool)){bool xBool = (bool)xFieldInfo.GetValue(list[i]);bool yBool = (bool)yFieldInfo.GetValue(list[i + 1]);long xValue2 = xBool ? 1 : 0;long yValue2 = yBool ? 1 : 0;xValue = xValue2;yValue = yValue2;}if (xValue != yValue){return true;}}}return false;}
调用:
public void SortFriendList(){List<SortFieldData> sortList = new List<SortFieldData>();SortFieldData sortData;//mGameFriendList中元素的donateSort字段从高到低排序sortData = new SortFieldData();sortData.name = "donateSort";sortData.sortType = SortType.Descend;sortList.Add(sortData);//mGameFriendList中元素的lv字段从高到低排序sortData = new SortFieldData();sortData.name = "lv";sortData.sortType = SortType.Descend;sortList.Add(sortData);//mGameFriendList中元素的friend_id字段从高到低排序sortData = new SortFieldData();sortData.name = "friend_id";sortData.sortType = SortType.Descend;sortList.Add(sortData);for (int i = 0; i < mGameFriendList.Count; i++){SetDonateSort(mGameFriendList[i]);}GlobalFunction.CustomSort(mGameFriendList, sortList);}
List 中的元素排序相关推荐
- java中list元素排序_java list集合元素根据某些字段排序
一.jdk1.6的环境下 新建ComparatorSort类,并实现Comparator接口,重写compare方法 降序排序:o1的元素>o2的元素,并返回-1:o1的元素小于o2的元素,并返 ...
- Map 四种获取 key 和 value 值的方法,以及对 map 中的元素排序
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 获取map的值主要有四种方法,分为两类: 调用 map.keySet() 方法来获取 key ...
- Map四种获取key和value值的方法,以及对map中的元素排序
2019独角兽企业重金招聘Python工程师标准>>> 获取map的值主要有四种方法,这四种方法又分为两类: 一类是调用map.keySet()方法来获取key和value的值, 另 ...
- 【C++简明教程】Python和C++指定元素排序比较
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习初学者 Python 中的排序 在 Python ...
- python数组中最大元素_Python获取numpy数组中最大的5个元素(保持原顺序)
本文主要演示numpy的argsort()函数的用法.这个函数的返回值是数组中的元素排序后的原下标,例如np.argsort([3,1,2])的返回结果是array([1, 2, 0], dtype= ...
- java list 拼音排序_java中实现List集合中对象元素按其属性的中文拼音排序
java中List集合的元素是按照添加顺序排序的,我们在实际开发过程中,可能会遇到需要对其内容进行排序的场景,接下来对我遇到的场景所采用的解决方式做个总结. 一.业务场景 管理后台商户名称下拉列表,需 ...
- 算法----- 在排序数组中查找元素的第一个和最后一个位置
题目: 在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置.你的算法时间复杂度必须是 O(log ...
- python 在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置.如果数组中不存在目标值 target,返回 ...
- LeetCode (二分小专题)33搜索旋转排序数组34在排序数组中查找元素的第一个和最后一个位置35搜索插入位置
前言 国庆前最后一次打卡,国庆后继续开启,公众号bigsai回复进群欢迎加入打卡,如有帮助记得点赞收藏. 近期打卡记录: LeetCode 32最长有效括号(困难) (本周) LeetCode 30串 ...
最新文章
- Python3中collections.OrderedDict介绍
- mysqldump远程备份mysql数据库方法
- 自定义grains_module pillar
- 当微信小程序遇上TensorFlow:Server端实现补充
- kaggle中的MAP理解
- webpack笔记一:webpack的介绍,安装,加载css、图片、字体等
- 48.Linux/Unix 系统编程手册(下) -- System V 共享内存
- AD导入原理图库PCB库文件 最强原理图PCB库
- python处理excel格式变化,分类,归类,行变列
- Python之通过API获取数据库数据及图片
- AtCoder Beginner Contest 262 部分题解
- 清华软院保研机试总结
- android usb 以太网,如何在Android智能手机上通过USB-OtG使用连接USB的有线以太网适配器?...
- 海康摄像头opencv实时回调
- freemarker中的split字符串分割
- 计算机应用基础及ms office应用,计算机应用MS Office基础练习题
- ExtrudeGeometry
- hashcode返回值可能为负数
- 为何说特斯拉Model 3有望成为2021年欧洲电动车销冠?
- 自助任务平台小项目感想
热门文章
- 网络分析shell脚本(实时流量+连接统计)
- 老旗舰华为能用上鸿蒙吗,荣耀手机能升级鸿蒙吗?五款旗舰优先,老荣耀机主或有惊喜...
- 【Shell】检查字符串大小
- 数据异常值分析和处理
- 如何解决python 图表中文显示乱码问题(matlplotlib 包)
- “fatal error C1010”错误解决的三种方法
- Git子模块头#39;引用不是树#39;错误
- 卸载/删除Homebrew包,包括其所有依赖项
- win11系统卡死怎么办 Windows11系统卡死的解决方法
- windows命令总结