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 ...
随机推荐
- Thunder团队第一次Scrum会议
Scrum会议1 小组名称:Thunder 项目名称:待定 参会成员: 王航(Master):http://www.cnblogs.com/wangh013/ 李传康:http://www.cnblo ...
- TCP系列30—窗口管理&流控—4、Cork算法
一.Cork算法概述 Cork算法与Nagle算法类似,也有人把Cork算法称呼为super-Nagle.Nagle算法提出的背景是网络因为大量小包小包而导致利用率低下产生网络拥塞,网络发生拥塞的时候 ...
- TCP系列22—重传—12、Forward Retransmit
一.概述 forward retransmit相关的内容在RFC6675中有描述,可以参考RFC6675 section 4中NextSeg ()的定义.forward retransmit中文名可以 ...
- C# Dsoframer.ocx 如何在winform中嵌入Excel,内嵌Excel,word
如果你还不太清楚Dspframer.ocx怎么放到窗体上就看上一篇文章,里面详细介绍了是如何放到窗体上的. 链接:http://www.cnblogs.com/pingming/p/4182045.h ...
- 第25天:js-封装函数-淘宝鼠标展示
封装函数: 1.函数形参相当于变量,不能加引号. 2.实参要和形参一一对应. 案例:鼠标移到小图上,背景展示相应放大的图片.代码如下: <!DOCTYPE html> <html l ...
- WPF文件和文件夹的操作
1.对文件的操作 private void button_chose_Click(object sender, RoutedEventArgs e) { var openFileDialog = ne ...
- ViewData与ViewBag
ViewData与ViewBag使用的是同一个数据源,因此数据一样,只是ViewBag 不再是字典的键值对结构,而是 dynamic 动态类型(http://www.cnblogs.com/kissd ...
- 【.Net】Visual Studio的调试技巧
这是我写的关于VS2010和.Net4发布的博客系列的第26篇. 今天的博文包含了一些有用的能用于VS的调试技巧. 我的朋友Scott Cate(他写了很多很好的关于VS使用技巧和窍门的博客)最近向我 ...
- 【bzoj1901】Zju2112 Dynamic Rankings 离散化+主席树+树状数组
题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...
- Java入门之:基本数据类型
Java基本数据类型 变量就是申请内存来存储值,也就是说,当创建变量的时候,需要在内存中申请空间.内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来存储该类型的数据,如下图所示: 因此, ...