c# 自定义排序Compare
.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的更多相关文章
- Java集合框架实现自定义排序
Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...
- 定制对ArrayList的sort方法的自定义排序
java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将Arr ...
- Qt之QHeaderView自定义排序(QSortFilterProxyModel)
简述 对以上节的排序,我们衍伸了两点: 把一个字符串前面的数据按照字符串比较,而后面的数据按照整形比较. 将整形显示为字符串,而排序依然正常呢. 为了分别描述,这里我们先解决问题1. 简述 效果 处理 ...
- 【Java】Treeset实现自定义排序
两个类,一个学生类,含姓名和出生日期两个属性:还有一个学生排序类,重写compare函数,自定义排序规则是先比较出生日期,如果相同再比较姓名字母 package birthday; import ja ...
- XtraReport交叉表隐藏列标题及自定义排序
1.隐藏列标题 用DevExpress PivotGrid report 做报表的时候,将字段拖放到报表中后,ColumnArea和DataArea会显示两个标题字段,如下图: 选中交叉表,设置以下属 ...
- DEV控件自定义排序实现
一般的控件或者组件都支持按照某一列进行排序.但是,这种排序是根据数据源里的数据默认按照降序或升序排序的,同时这样的排序与字段的类型有关. 假设现在字段的类型是字符串类型 ,但是,存储的数据时数字加一些 ...
- Collections.sort自定义排序的使用方法
Collections.sort自定义排序的使用方法 总结:Collections可以对List进行排序:如果想对Map进行排序,可以将Map转化成List,进行排序: public static v ...
- Comparator与Comparable,自定义排序和类比较器,TreeSet对象排序
/** * 学生类 * @author Administrator * */ public class Student { private String sno ; private String sn ...
- .NET/C#中对自定义对象集合进行自定义排序的方法
一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...
随机推荐
- Python练习—文件
1.随机生成20个两位正整数,将其升序排序后再写入文本文件data_asc.txt中! import random alist = [random.randint(10,100) for i in r ...
- Android开发 使用 adb logcat 显示 Android 日志
作者 : 万境绝尘 转载请著名出处 eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入 ...
- 创建、编译、执行 java程序
java源文件(.java)——Java字节码文件(.class)——在java虚拟机上执行 其他语言很多是编译后执行,所以无法跨平台
- 在LaTex中插入电路图的方法(插入图片)
主要的需求是要在文档中插入电路图. 有两种方法,一种是直接在LaTex中绘制电路图,使用的库主要是circ和circuitikz 另一种是在其他软件上绘制电路图,转成特定图像格式后,在Latex中插入 ...
- lintcode-186-最多有多少个点在一条直线上
186-最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...
- <Effective C++>读书摘要--Implementations<一>
1.For the most part, coming up with appropriate definitions for your classes (and class templates) a ...
- 读写INI文件操作类
详情介绍:http://zh.wikipedia.org/wiki/INI%E6%96%87%E4%BB%B6 示例: 下面是一个虚拟的程序,其INI文件有两个小节,前面的小节是用来设置拥有者的信息, ...
- pycharm开启代码智能提示和报错提示
天呐,经历了一大波周折,终于把提示给弄好了,加入没有提示的话,pycharm就是一个空格了,没有什么作用,对我来说,真的是很困难的事情,所以无论如何都要去把这个智能提示给搞好了. 先讲讲我的经历吧.我 ...
- 【week2】结对编程-四则运算 及感想
首先我要说一下,我得作业我尽力了,但是能力有限,还需练习. 四则运算,改进代码流程: 1.手动输入算式(属于中缀表达式) 2.将中缀表达式转化成后缀表达式 生成out数组 3.一个操作数栈,一个运算符 ...
- 关于对 NUMA 理解(学习笔记,便于以后查阅)
对NUMA的理解: NUMA是多核心CPU架构中的一种,其全称为Non-Uniform Memory Access,简单来说就是在多核心CPU中,机器的物理内存是分配给各个核的,架构简图如下所示: 每 ...