C# List<> 实现 IComparer 接口 排序

C# 的 List<> 容器提供了  IComparer 接口 来让使用者可以灵活的对 容器进行排序。

下面通过对一个背包 List<> 进行以下规则排序:

1、首先按道具类型排序

2、类型相同然后按道具品级排序

3、品级相同然后按等级排序

转自 http://blog.csdn.net/huutu http://www.thisisgame.com.cn

using System;
using System.Collections.Generic;
using System.Text;

namespace bagtest
{

    public class ItemInfo
    {

        public int mItemType; //1道具  2礼包;
        public int mItemLevel;//等级;
        public int mitemRank;//品级;

        public ItemInfo(int itemtype, int itemlevel, int itemrank)
        {
            mItemType = itemtype;
            mItemLevel = itemlevel;
            mitemRank = itemrank;
        }

        public bool isSame(ItemInfo iteminfo)
        {
            if ((mItemType == iteminfo.mItemType) && (mitemRank == iteminfo.mitemRank) && (mItemLevel == iteminfo.mItemLevel))
            {
                return true;
            }
            return false;
        }
    }

    public class ItemInfoCompare : IComparer<ItemInfo>
    {
        public int Compare(ItemInfo infoA, ItemInfo infoB)
        {
            if (infoA.isSame(infoB))
            {
                return 0;
            }

            //首先比较类型;
            if (infoA.mItemType > infoB.mItemType)
            {
                return 1;
            }
            else if (infoA.mItemType < infoB.mItemType)
            {
                return -1;
            }

            //类型相同,比较品级;
            if (infoA.mitemRank > infoB.mitemRank)
            {
                return 1;
            }
            else if (infoA.mitemRank < infoB.mitemRank)
            {
                return -1;
            }

            //品级相同,比较等级;
            if (infoA.mItemLevel > infoB.mItemLevel)
            {
                return 1;
            }
            else if (infoA.mItemLevel < infoB.mItemLevel)
            {
                return -1;
            }

            return 0;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            List<ItemInfo> itemInfoList = new List<ItemInfo>();

            itemInfoList.Add(new ItemInfo(1, 2, 2));//道具 2级 品级3

            itemInfoList.Add(new ItemInfo(2, 3, 2));//礼包 2级 品级1

            itemInfoList.Add(new ItemInfo(1, 3, 2));//道具 2级 品级2

            itemInfoList.Add(new ItemInfo(1, 2, 1));//道具 2级 品级1

            itemInfoList.Add(new ItemInfo(1, 2, 3));//道具 2级 品级3

            itemInfoList.Add(new ItemInfo(2, 2, 1));//礼包 2级 品级1

            itemInfoList.Add(new ItemInfo(1, 1, 1));//道具 1级 品级1

            itemInfoList.Add(new ItemInfo(2, 1, 3));//礼包 1级 品级3

            //输出a中全部元素
            Console.WriteLine("排序前");
            foreach (var v in itemInfoList)
            {
                Console.WriteLine("v.mItemType=" + v.mItemType + "  v.mitemRank=" + v.mitemRank + "  v.mItemLevel=" + v.mItemLevel);
            }

            SortItem(itemInfoList);

            //输出a中全部元素
            Console.WriteLine("排序后");
            foreach (var v in itemInfoList)
            {
                Console.WriteLine("v.mItemType=" + v.mItemType + "  v.mitemRank=" + v.mitemRank + "  v.mItemLevel=" + v.mItemLevel);
            }

            Console.ReadLine();
        }

        static void SortItem(List<ItemInfo> itemInfoList)
        {
            itemInfoList.Sort(new ItemInfoCompare());
        }
        }
}

转自 http://blog.csdn.net/huutu http://www.thisisgame.com.cn

时间: 2024-08-03 11:27:36

C# List<> 实现 IComparer 接口 排序的相关文章

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

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

IComparable和IComparer接口

C#中,自定义类型,支持比较和排序,需要实现IComparable接口.IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表示当前对象大于被比较对象,0表示两者相等,-1表示当前对象小于被比较对象. public int CompareTo(object o) {} 若想以更加灵活的方式对自定义类进行比较,可以声明一个继承自IComparer接口的比较器,实现接口方法Comprae(),接收2个object类型参数作为比

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

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

c# 内部类使用接口IComparer实现排序

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 内部类使用接口实现排序 { class Person { private string _name; private int _age; public Person(string name, int age) { _name = name; _ag

C# 中 List.Sort运用(IComparer&lt;T&gt;)排序用法

/// <summary> /// 比较人物类实例大小,实现接口IComparer /// </summary> public class InternetProtocolComparer : IComparer<InternetProtocol> { public int Compare(InternetProtocol x, InternetProtocol y) { if (x == null) { if (y == null) return 0; else re

IComparable和IComparer接口的简析

默认情况下,对象的Equals(object o)方法是比较两个对象是否引用同一个对象.如果我们有自己的对象,就要自己定义对象比较方式: 1.IComparable在要比较的对象(类的实例化就是对象)类中实现,可以比较该对象和另一个对象. 2.IComparer在一个单独的类中实现,可以任意比较两个对象. 通俗的讲,IComparable是能够比较,具备比较的能力.比如说某个人具备编程的能力,如果需要对编程能力的高低进行比较的话,就必须在自己的类中去实现怎么具体的方法.IComparer是比较者

C# 重写IComparer 接口

首先定义比较类 继承自IComparer<Racer> 1 public class RacerComparer : IComparer<Racer> 2 { 3 public enum CompareType 4 { 5 FirstName, LastName, Country, Wins 6 } 7 private CompareType compareType; 8 public RacerComparer(CompareType compareType) 9 { 10 th

实现IComparable、IComparer接口

using System;using System.Collections.Generic; public class MyClass{ public class Employee:IComparable<Employee> { public int EmpID; public string YearsOfSvc = "1"; public Employee(int id) { EmpID = id; } public Employee(int id , string ys

c# IComparable与IComparer接口

原文地址:https://www.cnblogs.com/fanweisheng/p/11517698.html