.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. python学习笔记08:安装django

    linux环境安装django: sudo pip install django windows环境安装django: pip install django 验证django是否安装: python ...

  2. iOS- 移动端Socket UDP协议广播机制的实现

    1.前言    什么是UDP协议广播机制?      举一个例, 例如在一群人群中,一个人要找张三,于是你向人群里大喊一声(广播):“谁是张三”   如果它是张三,它就会回应你,在网络中也是一样的. ...

  3. iOS开发SDWebImage源码解析之SDWebImageManager的注解

    最近看了两篇博客,写得很不错,关于SDWebImage源码解析之SDWebImageManager的注解: 1.http://www.jianshu.com/p/6ae6f99b6c4c 2.http ...

  4. SVM之问题形式化

    >>>SVM之问题形式化 SVM之对偶问题 SVM之核函数 SVM之解决线性不可分 写在SVM之前——凸优化与对偶问题 SVM内容繁多,打算用五篇文章来记述.SVM之问题形式化描述给 ...

  5. python json 序列化

    如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过 ...

  6. dpr dproj 扩展名区别,dprdproj

    这段时间用xe6,看了下目录下生成的一些文件,因为隐藏了扩展名,看到两个名字一样的文件,右键属性看了下,同名但扩展名不同,百度了下区别,没有找到答案,问群里的朋友才知道区别,特此记录下来: dpr:D ...

  7. 【Python】Python中*args 和**kwargs的用法

    好久没有学习Python了,应为工作的需要,再次拾起python,唤起记忆. 当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. 还是 ...

  8. BZOJ 1898 沼泽鳄鱼(矩阵快速幂)

    没有食人鱼不是裸题吗,用一个向量表示从s到1..N的距离,然后不停乘邻接矩阵行了,当然快速幂 有食人鱼,发现食人鱼最多十二个邻接矩阵一循环,处理出12个作为1个然后快速幂行了   怎么处理呢? 假设食 ...

  9. bzoj4502 串

    题意:给你n(n<=10000)个字符串,每个字符串的长度不超过30,可以选择两个非空前缀把它们拼起来得到一个字符串(这两个前缀可以来自同一个字符串,也可以是同一个字符串的同一个非空前缀),问得 ...

  10. JavaScript中Switch使用

    switch 语句用于基于不同的条件来执行不同的动作.使用 switch 语句来选择要执行的多个代码块之一. switch(n) { case 1: 执行代码块 1 break; case 2: 执行 ...