.net FrameWork 框架博大精深,用着忘着,计划对自己能够想到知识点梳理一下,此篇是对自定义排序的理解:

class Program {

        static void Main(string[] args)
{
Random random = new Random();
ClassA[] arr = new ClassA[];//数组还有IEnumerator是没有实现Sort的,List实现了 Console.WriteLine("Source Value:");
for (int i = ; i < ; i++)
{
arr[i] = new ClassA(random.Next(), random.Next());
Console.WriteLine(arr[i].XY);
}
Console.WriteLine();
Console.WriteLine("Source ToList Value:");
var list = arr.ToList();
for (int i = ; i < ; i++)
{
Console.WriteLine(list[i].XY);
}
Console.WriteLine();
Console.WriteLine("Source ToList Sort Value:");
list.Sort();
for (int i = ; i < ; i++)
{
Console.WriteLine(list[i].XY);
}
Console.WriteLine();
Console.WriteLine("Source ToList Compare Value:");
list.Sort(new ClassAComparer());//简单实现降序
//等同于 list.Sort((x,y)=>-x.CompareTo(y));//实现降序
for (int i = ; i < ; i++)
{
Console.WriteLine(list[i].XY);
} Console.WriteLine();
Console.WriteLine("Priority Source Value:");
//在一些常用场景经常会有优先级的概念,针对有优先级的排序,可以参照如下:
//Tuple<int,int> ,Item1的优先级大于Item2的优先级
List<Tuple<int, int>> list_priority = new List<Tuple<int, int>>();
for (int i = ; i < ; i++)
{
Tuple<int, int> xy = new Tuple<int, int>(random.Next(), random.Next());
list_priority.Add(xy);
Console.WriteLine(string.Format("{{X:{0},Y:{1}}}", xy.Item1, xy.Item2));
} Console.WriteLine();
Console.WriteLine("Priority Source Sort Value:");
list_priority.Sort((x, y) =>
{
if (x.Item1 > y.Item1)
return ;
else if (x.Item1 == y.Item1)
return x.Item2 - y.Item2;
else
return -;
});
for (int i = ; i < ; i++)
{
Console.WriteLine(string.Format("{{X:{0},Y:{1}}}", list_priority[i].Item1, list_priority[i].Item2));
}
Console.ReadKey(); //其实还有一些场景,会用到权重的概念,尤其是针对一些客户定级别时候,这个时候的排序,建议权重高的,
//排序时候去平方,或者倍乘等方式,涉及到权重的,都是玄之又玄,出来的结果大致满意就很棒了。。。
}
} class ClassA:IComparable<ClassA>//定义在对象上的自定义排序,这里引用泛型,不需类型转换
{
public ClassA(int x, int y)
{
this.X = x;
this.Y = y;
}
public int X { get; set; } public int Y { get; set; } public string XY
{
get
{
return string.Format("{{X:{0},Y:{1}}}", X, Y);//C#打印大括号,左大括号{{,有大括号}}
}
} public int CompareTo(ClassA other)
{
int val = X + Y;
int otherVal = other.X + other.Y;
return val - otherVal;//三种结果 1,-1,0分别是大,小,相等
}
} class ClassAComparer : IComparer<ClassA>//单独定义的排序规则
{
public int Compare(ClassA x, ClassA y)
{
int valX = x.X + x.Y;
int valY = y.X + y.Y;
return valY - valX;
}
}

在做一个对象集的比较时候,用到不同的比较规则,这个时候,用一个封装,如下:

 public class Compare<T> : IEqualityComparer<T>
{
private Func<T,T,bool> _equalsComparer; public Compare(Func<T,T,bool> equalsComparer)
{
this._equalsComparer = equalsComparer;
} public bool Equals(T x, T y)
{
if (null != this._equalsComparer)
return this._equalsComparer(x, y);
else
return false;
} public int GetHashCode(T obj)
{
return obj.GetHashCode();
}
}

c# 自定义排序Compare的更多相关文章

  1. Java集合框架实现自定义排序

    Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...

  2. 定制对ArrayList的sort方法的自定义排序

    java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将Arr ...

  3. Qt之QHeaderView自定义排序(QSortFilterProxyModel)

    简述 对以上节的排序,我们衍伸了两点: 把一个字符串前面的数据按照字符串比较,而后面的数据按照整形比较. 将整形显示为字符串,而排序依然正常呢. 为了分别描述,这里我们先解决问题1. 简述 效果 处理 ...

  4. 【Java】Treeset实现自定义排序

    两个类,一个学生类,含姓名和出生日期两个属性:还有一个学生排序类,重写compare函数,自定义排序规则是先比较出生日期,如果相同再比较姓名字母 package birthday; import ja ...

  5. XtraReport交叉表隐藏列标题及自定义排序

    1.隐藏列标题 用DevExpress PivotGrid report 做报表的时候,将字段拖放到报表中后,ColumnArea和DataArea会显示两个标题字段,如下图: 选中交叉表,设置以下属 ...

  6. DEV控件自定义排序实现

    一般的控件或者组件都支持按照某一列进行排序.但是,这种排序是根据数据源里的数据默认按照降序或升序排序的,同时这样的排序与字段的类型有关. 假设现在字段的类型是字符串类型 ,但是,存储的数据时数字加一些 ...

  7. Collections.sort自定义排序的使用方法

    Collections.sort自定义排序的使用方法 总结:Collections可以对List进行排序:如果想对Map进行排序,可以将Map转化成List,进行排序: public static v ...

  8. Comparator与Comparable,自定义排序和类比较器,TreeSet对象排序

    /** * 学生类 * @author Administrator * */ public class Student { private String sno ; private String sn ...

  9. .NET/C#中对自定义对象集合进行自定义排序的方法

    一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...

随机推荐

  1. jspSmartUpload上传下载使用例子

    --------------------------------------------------------------------- ServletUpload.java 上传 package ...

  2. iOS- Swift实现UITableView的常见操作

    1.前言   Swift在这就不多介绍了,想必大家都已皆知. 离Swift面世也过了有一个多月的时间. 在闲暇时间我用Swift实现了UITableView的一些常见操作. 基本都是可以用上的,今天在 ...

  3. 如何在flink中传递参数

    众所周知,flink作为流计算引擎,处理源源不断的数据是其本意,但是在处理数据的过程中,往往可能需要一些参数的传递,那么有哪些方法进行参数的传递?在什么时候使用?这里尝试进行简单的总结. 使用conf ...

  4. 从HR 到SBP其实还有很长的一段路要走

    战略性业务伙伴 Strategic business partners 关于这本书,一般是因为好奇,从HR到BP的角色,再到这个SBP,其实是一段没有走过的很虚的过程,不过总归是需要灯塔,即使偶尔只是 ...

  5. 【其他】VS提示不一致的行尾

    应该是用不同的编辑器或平台编辑过同一个文件,比如Windows是\r\n,有的系统只有一个\n, 需要都统一,否则代码可能会堆成一堆.

  6. Java序列简单使用

    package javatest; import java.io.*; public class SerializableTest implements Serializable { public s ...

  7. P1135 奇怪的电梯

    题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开 ...

  8. BZOJ4553:[HEOI2016/TJOI2016]序列——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4553 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某 ...

  9. CF633C:Spy Syndrome 2——题解

    https://vjudge.net/problem/CodeForces-633C http://codeforces.com/problemset/problem/633/C 点击这里看巨佬题解 ...

  10. 洛谷4245:【模板】任意模数NTT——题解

    https://www.luogu.org/problemnew/show/P4245 给两个多项式,求其乘积,每个系数对p取模. 参考: 代码与部分理解参考https://www.luogu.org ...