首先先介绍一下平时最常用的几种排序方法。
第一种:实体类实现IComparable接口,而且必须实现CompareTo方法
实体类定义如下:

class Info:IComparable
{
public int Id { get; set; }
public string Name { get; set; } public int CompareTo(object obj) {
int result;
try
{
Info info = obj as Info;
if (this.Id > info.Id)
{
result = ;
}
else
result = ;
return result;
}
catch (Exception ex) { throw new Exception(ex.Message); }
}
}

调用方式如下,只需要用sort方法就能实现对list进行排序。

private static void ReadAccordingCompare() {
List<Info> infoList = new List<Info>();
infoList.Add(
new Info() { Id = , Name = "abc" });
infoList.Add(new Info() { Id = , Name = "rose" });
infoList.Add(new Info() { Id = , Name = "woft" });
infoList.Sort();
foreach (var item in infoList)
{
Console.WriteLine(item.Id + ":" + item.Name);
}
}
第二种方法:linq to list进行排序
运用linq实现对list排序,在实体类定义的时候就不需用实现IComparable接口,调用方式如下:

private static void ReadT(string str) {
List<Info> infoList = new List<Info>();
infoList.Add(
new Info() { Id = , Name = "woft" });
infoList.Add(new Info() { Id=,Name="rose"});
infoList.Add(new Info() { Id = , Name = "abc" });
Console.WriteLine("ReadT*********************");
IEnumerable<Info> query = from items in infoList orderby items.Id descending select items;
foreach (var item in query)
{
Console.WriteLine(item.Id+":"+item.Name);
}
}
但是上面两种方式都只能对一个实体属性排序,如果对不同的属性排序的话只能写很多的if进行判断,这样显得很麻烦。
且看下面的方式实现根据传入参数进行排序。

private static void ListSort(string field,string rule)
{
if (!string.IsNullOrEmpty(rule) && (rule.ToLower().Equals("desc") || rule.ToLower().Equals("asc")))
{
try
{
List<Info> infoList = GetList();
infoList.Sort(
delegate(Info info1, Info info2)
{
Type t = typeof(Info);
PropertyInfo pro = t.GetProperty(field);
return rule.ToLower().Equals("asc") ?
pro.GetValue(info1, null).ToString().CompareTo(pro.GetValue(info2, null).ToString()) :
pro.GetValue(info2, null).ToString().CompareTo(pro.GetValue(info1, null).ToString());
});
Console.WriteLine("*****ListSort**********");
foreach (var item in infoList)
{
Console.WriteLine(item.Id + "," + item.Name);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
else
Console.WriteLine("ruls is wrong");
}

Linq的排序方法

Order By操作


适用场景:对查询出的语句进行排序,比如按时间排序等等。
说明:按指定表达式对集合排序;延迟,:按指定表达式对集合排序;延迟,默认是升序,加上descending表示降序,对应的扩展方法是OrderBy和OrderByDescending

1.简单形式

这个例子使用 orderby 按雇用日期对雇员进行排序:

var q = from e in db.Employees orderby e.HireDate select e;
说明:默认为升序

2.带条件形式

注意:Where和Order By的顺序并不重要。而在T-SQL中,Where和Order By有严格的位置限制。

var q = from o in db.Orders where o.ShipCity == "London" orderby o.Freight select o;
语句描述:使用where和orderby按运费进行排序。

3.降序排序

var q = from p in db.Products orderby p.UnitPrice descending select p;

4.ThenBy

语句描述:使用复合的 orderby 对客户进行排序,进行排序:

var q = from c in db.Customers orderby c.City, c.ContactName select c;

说明:按多个表达式进行排序,例如先按City排序,当City相同时,按ContactName排序。这一句用Lambda表达式像这样写:

var q = db.Customers .OrderBy(c => c.City) .ThenBy(c => c.ContactName).ToList();

在T-SQL中没有ThenBy语句,其依然翻译为OrderBy,所以也可以用下面语句来表达:

var q = db.Customers .OrderBy(c => c.ContactName) .OrderBy(c => c.City).ToList();

所要注意的是,多个OrderBy操作时,级连方式是按逆序。对于降序的,用相应的降序操作符替换即可。

var q = db.Customers .OrderByDescending(c => c.City) .ThenByDescending(c => c.ContactName).ToList();

需要说明的是,OrderBy操作,不支持按type排序,也不支持匿名类。比如

var q = db.Customers .OrderBy(c => new { c.City, c.ContactName }).ToList();

会被抛出异常。错误是前面的操作有匿名类,再跟OrderBy时,比较的是类别。比如

var q = db.Customers .Select(c => new     { c.City, c.Address }) .OrderBy(c => c).ToList();

如果你想使用OrderBy(c => c),其前提条件是,前面步骤中,所产生的对象的类别必须为C#语言的基本类型。比如下句,这里City为string类型。

var q = db.Customers .Select(c => c.City) .OrderBy(c => c).ToList();

5.ThenByDescending

这两个扩展方式都是用在OrderBy/OrderByDescending之后的,第一个ThenBy/ThenByDescending扩展方法作为第二位排序依据,第二个ThenBy/ThenByDescending则作为第三位排序依据,以此类推

var q = from o in db.Orders where o.EmployeeID ==  orderby o.ShipCountry, o.Freight descending select o;
语句描述:使用orderby先按发往国家再按运费从高到低的顺序对 EmployeeID 1 的订单进行排序。

6.带GroupBy形式

var q = from p in db.Products group p by p.CategoryID into g orderby g.Key select new { g.Key, MostExpensiveProducts = from p2 in g where p2.UnitPrice == g.Max(p3 => p3.UnitPrice) select p2 };

语句描述:使用orderby、Max 和 Group By 得出每种类别中单价最高的产品,并按 CategoryID 对这组产品进行排序。

C# List排序,附加使用Linq排序的更多相关文章

  1. [No000087]Linq排序,SortedList排序,二分法排序性能比较

    using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...

  2. 列表排序之NB三人组附加一个希尔排序

    NB三人组之 快速排序 def partition(li, left, right): tmp = li[left] while left < right: while left < ri ...

  3. 排序算法总结------选择排序 ---javascript描述

    每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...

  4. 排序图解:js排序算法实现

    之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...

  5. lua table 排序--满足多条件排序

    前提 假设 一个小怪 有三种属性,等级(level).品质(quality).id(pid) 我们需要对他们进行排序,两种排序情况,第一是单一属性排序,比如按照等级进行排序,或者多种属性进行优先级排序 ...

  6. 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较

    2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...

  7. C++ STL中Map的按Key排序和按Value排序

    map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...

  8. Map排序——按key排序,按value排序

    注:转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5959279.html 上一篇博文谈到了集合类的自定义排序方式,那么进一步扩展开来,与集合同等重要的Map有 ...

  9. Java常见排序算法之Shell排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

随机推荐

  1. DeepFaceLab报错,OOM如何解决?

    DeepFaceLab出错,虽然错误提示好几个屏幕,但是无非两种情况,一种是驱动没装好,一种是显存配置不够.上一篇文章说了驱动的问题,这一篇就说说配置不够的问题. 这个问题的表现形式,往往是各种OOM ...

  2. php实现的三个常用加密解密功能函数示例

    目录 算法一: 算法二: 算法三(改进第一个加密之后的算法) 本文实例讲述了php实现的三个常用加密解密功能函数.分享给大家供大家参考,具体如下: 算法一: //加密函数 function lock_ ...

  3. Python3爬取人人网(校内网)个人照片及朋友照片,并一键下载到本地~~~附源代码

    题记: 11月14日早晨8点,人人网发布公告,宣布人人公司将人人网社交平台业务相关资产以2000万美元的现金加4000万美元的股票对价出售予北京多牛传媒,自此,人人公司将专注于境内的二手车业务和在美国 ...

  4. libevent 信号事件实现方式

    学会使用libevent,才能真正的掌握其是实现原理,我们先从一个简短的测试用例开始: #include <sys/types.h> #include <sys/stat.h> ...

  5. HTML插入文件链接(如音乐,照片)

    html中插入音频.H5的标签 src为本地 <audio controls="> <source src="韩庚 - I Don't Give A 屑.mp3& ...

  6. Django基础之Form表单验证

    Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...

  7. cf976f Minimal k-covering

    枚举 \(k\),对于每个点 \(i\) 我们最多删 \(deg_i-k\) 条边,就源点向第一部.第二部向汇点连边,容量是 \(deg_i-k\),原边连上,容量是 \(1\),这样每流过一条原边在 ...

  8. exkmp略解

    推导 ext[i]表示母串s[i..lens]和子串t[1..lent]的最长公共前缀. nxt[i]表示t[i..lent]和t[1..lent]的最长公共前缀. 假设ext[1..k]已经算好,现 ...

  9. [网站公告]又拍云API故障造成图片无法上传(已恢复)

    大家好,18:00左右开始,又拍云API出现故障,调用图片上传API时出现错误:“The remote server returned an error: (403) Forbidden.”,造成图片 ...

  10. leetcode 【 Triangle 】python 实现

    题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...