最近在看 记忆失去的青春的mvc系列时 第十五讲里要实现个功能叫按表头排序 即按某一字段来排序。这样的功能在项目开发中是很常见的 。

当然最后青春通过数据库实现了排序功能。

可是我在想能不能在内存中实现排序呢?  即不通过sql查询而是通过list自己的方法Sort()来实现。当然这只是我一时兴起。关于性能问题暂不做讨论。

众所周知要比较引用类型需要实现System.Collections.IComparer 接口来具体指明比较逻辑即:

    public class Test : System.Collections.IComparer {public string Id { get; set; }public string Name { get; set; }/// <summary>/// 比较/// </summary>public int Compare(object x, object y){int result=0;//这里进行比较并给result赋值return result;}}

,或者自己定义比较方法即:

public static int Compare(Test test1, Test test2)
{return test1.Id.CompareTo(test2.Id);
}

但是我们需要的功能是实体每个字段都有可能来作为比较的运算逻辑。用这些方式来写一个俩个不要紧,那要是多个实体呢?每个实体有very very 多字段呢?显然会让我们眼湿的。。。

背景完毕。。割割割————————————————

显然Sort方法只是需要一个委托来进行比较,而对于表头进行排序这样的功能又有一个共性即:每次比较的都是同一列的值。那么我们是不是可以这样实现呢?

namespace LYDNG.Helper
{/// <summary>/// 实体比较类/// </summary>public class TCompare{public TCompare(string attrName){AttrName = attrName;}/// <summary>/// 要比较的实体的属性名称/// </summary>private string AttrName { get; set; }/// <summary>/// 比较两个实体/// </summary>/// <typeparam name="T">类型</typeparam>/// <param name="t1">实体1</param>/// <param name="t2">实体2</param>/// <returns></returns>public int CompareObject<T>(T t1, T t2){int i = 0;//默认是相等的if (t1 != null && t2 != null){i = getValueByAttrName<T>(t1, AttrName).CompareTo(getValueByAttrName<T>(t2, AttrName));}return i;}/// <summary>/// 以字符串形式获取属性值/// </summary>/// <typeparam name="T">类型</typeparam>/// <param name="t">实例</param>/// <param name="attrName">属性名</param>/// <returns>属性值</returns>public static string getValueByAttrName<T>(T t, string attrName){string result = "";if (t != null && !string.IsNullOrEmpty(attrName)){object value = t.GetType().GetProperty(attrName).GetValue(t, null);if (value != null){result = value.ToString();}}return result;}}
}

View Code

这样在需要排序的时候只需要:

listData.Sort(new LYDNG.Helper.TCompare(attrName).CompareObject<Models.Employee>);

(这里的attrName就是用户每次点击表头时对应的字段名,而Models.Employee就是要比较的实体类型)

就可以实现泛型列表的排序了。

如果想要写法更优雅来这里:http://www.cnblogs.com/haoqi/p/3403132.html

转载于:https://www.cnblogs.com/haoqi/p/LYDNG.html

关于List.Sort想到的相关推荐

  1. Leetcode: Sort List

    Sort a linked list in O(n log n) time using constant space complexity. 记得Insert Sort List, 那个复杂度是O(N ...

  2. Java数组排序: Array-ArrayList-List-Collections.sort()/List.sort()/Arrays.sort()

    文章目录 ArrayList/List 的排序:Collections.sort()/List.sort() Array 的排序:Arrays.sort() 此文首发于我的Jekyll博客:zhang ...

  3. 148. Sort List

    题目: Sort a linked list in O(n log n) time using constant space complexity. 链接: http://leetcode.com/p ...

  4. Shell Sort 希尔排序 收藏

    Shell Sort 希尔排序 收藏 希尔排序(Shell Sort)又叫做缩小增量排序(diminishing increment sort),是一种很优秀的排序法,算法本身不难理解,也很容易实现, ...

  5. leetcode day2 -- Sort List Insertion Sort List

    1.Sort List Sort a linked list in O(n log n) time using constant space complexity. 分析:对链表排序不是第一次见,但是 ...

  6. LeetCode 75 Sort Colors(颜色排序)

    翻译 给定一个包括红色.白色.蓝色这三个颜色对象的数组.对它们进行排序以使同样的颜色变成相邻的,其顺序是红色.白色.蓝色.在这里,我们将使用数字0.1和2分别来代表红色.白色和蓝色. 原文 Given ...

  7. 7.使用php描述冒泡排序,PHP 数据结构 算法描述 冒泡排序 bubble sort

    PHP 数据结构 算法描述 冒泡排序 bubble sort 复制代码 代码如下: /** * 冒泡排序 bubble sort * * 原理:多次循环进行比较,每次比较时将最大数移动到最上面.每次循 ...

  8. 1356. Sort Integers by The Number of 1 Bits 根据数字二进制下 1 的数目排序

    给你一个整数数组 arr .请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序. 如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列. 请你返回排序后的数组.   示 ...

  9. LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)

    LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...

最新文章

  1. LINUX系统环境下的QT编译安装
  2. 设置Golang的GOPATH
  3. mongodb简单的函数
  4. 【Java】基于注解开发初探
  5. js形参(parameter)和实参(argument)
  6. 好的产品经理都是这样绘制原型图的...
  7. odoo 开发者模式添加计算字段
  8. Netty in action—codec框架
  9. python中raise stoplteration_Python 中的异常处理
  10. int、String、char、Array之间的转换,这一篇够了!!!
  11. OrCAD 与 Cadence Allegro PCB 入门 - 以 16.6版本为例 (1)
  12. VR全景智慧城市三维实景的建设和呈现目标
  13. android模拟器横屏快捷键,Android模拟器横屏切换方法
  14. 用VUE实现注册页(短信验证码登录)
  15. 【附代码实现】Attention注意力模块的keras\tf实现(ECA、BAM、Coordinate、DualAttention、GlobalContext等)
  16. 大厂机密,30 提升团队研发效能的锦囊
  17. Linux上安装Nginx教程
  18. 盛世昊通:从2021上海国际车展看汽车产业变革,这些信号不容错过
  19. Apple是第一家价值1万亿美元的上市公司
  20. K8s(Kubernetes), docker中的registry是什么意思?和windows中的注册表registry有什么区别?

热门文章

  1. Android:Eclipse如何删除ADT
  2. “Runtime Error”不产生dump文件的解决办法
  3. Asp.net页面之间传递参数的几种方法
  4. ArcSDE工作机制
  5. ArcGIS的BLOB字段与Access数据库BLOB字段的交换
  6. 口琴膜片什么作用_新手怎么学口琴?
  7. 转换文档参数_1分钟教会你将Excel转换成Word,简单高效,办公人士必备神技
  8. (102)FPGA面试题-如何选择FPGA型号?
  9. endnote x9使用方法_一文掌握 Endnote 核心功能使用方法
  10. 数值计算方法(七)——两种消去法求解线性方程组