ICompare接口

using System;
using System.Collections;
namespace ConsoleEnum
{
    public class car : IComparable
    {
        //  嵌套类的开始。

        // 按年升序
        private class sortYearAscendingHelper : IComparer
        {
            //实现接口定义的方法
            int IComparer.Compare(object a, object b)
            {
                car c1 = (car)a;
                car c2 = (car)b;

                if (c1.year > c2.year)
                    return 1;

                if (c1.year < c2.year)
                    return -1;

                else
                    return 0;
            }
        }

        // 按年降序
        private class sortYearDescendingHelper : IComparer
        {
            int IComparer.Compare(object a, object b)
            {
                car c1 = (car)a;
                car c2 = (car)b;

                if (c1.year < c2.year)
                    return 1;

                if (c1.year > c2.year)
                    return -1;

                else
                    return 0;
            }
        }

        // 按制造商字母降序
        private class sortMakeDescendingHelper : IComparer
        {
            int IComparer.Compare(object a, object b)
            {
                car c1 = (car)a;
                car c2 = (car)b;

                return String.Compare(c2.make, c1.make);
            }
        }

        // 嵌套类结束

        private int year;
        private string make;

        //构造函数
        public car(string Make, int Year)
        {
            make = Make;
            year = Year;
        }

        //属性
        public int Year
        {
            get { return year; }
            set { year = value; }
        }

        public string Make
        {
            get { return make; }
            set { make = value; }
        }

        // 实现IComparable接口来提供默认的排序顺序的对比。
       // 将当前实例与同一类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例在排序顺序中的位置是位于另一个对象之前、之后还是与其位置相同。
        int IComparable.CompareTo(object obj)
        {
            car c = (car)obj;
            return String.Compare(this.make, c.make);
        }

        // 返回排序辅助IComparer对象的方法。
        public static IComparer sortYearAscending()
        {
            return (IComparer)new sortYearAscendingHelper();
        }

        // 返回排序辅助IComparer对象的方法。
        public static IComparer sortYearDescending()
        {
            return (IComparer)new sortYearDescendingHelper();
        }

        // 返回排序辅助IComparer对象的方法。
        public static IComparer sortMakeDescending()
        {
            return (IComparer)new sortMakeDescendingHelper();
        }

    }
}

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleEnum
{
    class host
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Create an arary of car objects.
            car[] arrayOfCars = new car[6]
            {
            new car("Ford",1992),
            new car("Fiat",1988),
            new car("Buick",1932),
            new car("Ford",1932),
            new car("Dodge",1999),
            new car("Honda",1977)
            };

            Console.WriteLine("Array - Unsorted\n");

            foreach (car c in arrayOfCars)
                Console.WriteLine(c.Make + "\t\t" + c.Year);

            // 演示时用“默认”排序的数组排序。
            Array.Sort(arrayOfCars);
            Console.WriteLine("\nArray - Sorted by Make (Ascending - IComparable)\n");

            foreach (car c in arrayOfCars)
                Console.WriteLine(c.Make + "\t\t" + c.Year);

            // Demo ascending sort of numeric value with IComparer.
                       //要排序的数组,自定义的排序规则
            Array.Sort(arrayOfCars, car.sortYearAscending());
            Console.WriteLine("\nArray - Sorted by Year (Ascending - IComparer)\n");

            foreach (car c in arrayOfCars)
                Console.WriteLine(c.Make + "\t\t" + c.Year);

            // Demo descending sort of string value with IComparer.
            Array.Sort(arrayOfCars, car.sortMakeDescending());
            Console.WriteLine("\nArray - Sorted by Make (Descending - IComparer)\n");

            foreach (car c in arrayOfCars)
                Console.WriteLine(c.Make + "\t\t" + c.Year);

            // Demo descending sort of numeric value using IComparer.
            Array.Sort(arrayOfCars, car.sortYearDescending());
            Console.WriteLine("\nArray - Sorted by Year (Descending - IComparer)\n");

            foreach (car c in arrayOfCars)
                Console.WriteLine(c.Make + "\t\t" + c.Year);

            Console.ReadLine();
        }
    }
}

  

时间: 2024-11-04 05:29:57

ICompare接口的相关文章

对象的比较与排序:IComparable和IComparer接口

IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: 1. IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象. 2. IComparer 在一个单独的类中实现,可以比较任意两个对象. 先看 IComparable 这个接口方法是 int CompareTo(object obj); 方法只有一个参数,我们知道比较至少要有两个对象,所以这个方法

C# IComparable接口、IComparer接口和CompareTo(Object x)方法、Compare()方法

在项目中经常会用到字符串比较,但是有时候对字符串的操作比较多,规则各异.比如有的地方我们需要用排序规则,有的地方需要忽略大小写,我们该如何写一个比较容易操作的比较方法呢?重新实现IComparer接口不失为一个好办法. IComparable.CompareTo 方法 在MSDN上是这么解释(机器翻译过来)的: IComparable接口:定义一种特定于类型的通用比较方法,值类型或类通过实现此方法对其实例进行排序. IComparer接口:公开一种比较两个对象的方法. 详细理解就是: 在默认情况

编程思想之回调

原文:http://blog.csdn.net/luoweifu/article/details/41465289 <回调的原理.实现与应用>一文中已经初步讲了回调的原理和应用,并就一个实际需求用函数的方式实现了回调应用.但回调并不仅限于回调函数,可以有很多不同的现实方式.回调与其说是一种技术,不如说是一种编程思想,我们在各种计算机语言中都能看到它的踪影.我们以<回调的原理.实现与应用>一文中提到的需求为例,看看C++.JavaScript.Java等各种语言下回调的实现方式. 有

学习 各个数据结构

 数组: 数组 ,他可以存储相同类型的固定数量的数据,可以通过索引取得相应的值. 如果存储的是值类型的话:比如 int[] arr=new int[2];  那么变量arr 在栈上 ,他引用 两个 托管堆上的 int 值. 如果存储的是引用类型:比如 Person[] arr=new Person[2]: 那么 变量 arr.在栈上,这个变量引用了 用来存储 托管堆上person类的引用的数组. Array 类: 是一个抽象类,他实现了 ICloneable, IList, ICollectio

[枫叶学院] Unity3d高级开发教程 工具集(一) 哈希列表——强大的自定义数据集

在日常开发中,数据集合是我们必不可少的重要工具之一.在C#中,.Net Framework也为我们提供了种类繁多,功能多样的数据集工具.在此,我基于List<T> 和 HashTable制作了一个功能强大的数据集,我将其命名为HashList.他集二者的优势于一身,既支持数组索引的操作,同时也支持键值对操作.我更在此基础上封装了一些常用的工具函数,使其能够极大的方便我们日常开发中的数据管理. HashList 核心功能如下: 1.类型安全的数据集合,省去了强制转换的繁冗操作 2.根据数组索引,

回调之编程思想

<回调的原理.实现与应用>一文中已经初步讲了回调的原理和应用,并就一个实际需求用函数的方式实现了回调应用.但回调并不仅限于回调函数,可以有很多不同的现实方式.回调与其说是一种技术,不如说是一种编程思想,我们在各种计算机语言中都能看到它的踪影.我们以<回调的原理.实现与应用>一文中提到的需求为例,看看C++.JavaScript.Java等各种语言下回调的实现方式. 有一Person类,有年龄(age),体重(weight),身高(height)三个属性.现要对Person的一组对象

C#排序比较

与C#定义了相等性比较规范一样,C#也定义了排序比较规范,以确定一个对象与另一个对象的先后顺序.排序规范如下 IComparable接口(包括IComparable接口和IComparable<T>接口) >和<运算符 当需要实现排序算法时,使用IComparable接口.在下面的例子中,Array.Sort静态方法可以调用,是因为System.String类实现了IComparable接口. string[] colors={"Green", "Re

【进阶修炼】&mdash;&mdash;改善C#程序性能(1)

这是一个大纲形式的提点,以便自己可以花较少的时间时常浏览.在开发中,多加注意这些有用的建议,让自己成为一个更优秀的程序员.内容主要来自<编写高质量代码-改善C#程序的157个建议>(陆敏技),这本书写的真的很好,都是些实战经验的总结,建议大家购买此书,这其中的建议不光适合于C#,只要你做.NET开发,阅读此书都会从中受益.同时,如其他书籍和资料有好的建议,我也会不断更新到这里. 1, 字符串使用. 应避免发生装箱:避免分配额外的内存:考虑使用StringBuilder来替代string.str

2014.12.3笔记

java回调机制: Java中没有像C++这样的函数指针,所以不能将一个函数通过参数传递给另一个函数.因此Java中没有回调函数,但仍然可以有回调的机制.Java是一种纯面向对象的语言,它的回调可以通过面向对象的特性实现. 依然采用Person的例子,用Java实现回调.如下: ICompare接口: public interface ICompare { public int comparable(ICompare obj); } Person类: public class Person im