IComparable IComparer 比较器实例与使用

概述:

IComparable 表示类能够去比较。
IComparer 是比较器,能够去比较两个实例的大小。
鸡蛋和鸡蛋间本身无法比较哪个重,电子称可以分辨两个鸡蛋(或其他物体)谁更重,所以 电子称可以看作是IComparer
人可以通过掰手腕,比出那个人力气大,所以人可以看作是IComparable 可以相互间比较的。

比较器实例:

using System;
using UnityEngine;
using System.Collections.Generic;

public class UnrealDistanceComparer:Comparer<GameObject>
{
	private Vector3 _zeroPoint = Vector3.zero;
	//首先保存距离,若存在则取,否则重新计算
	private Dictionary<GameObject,float> dic_GoToZeroDistance = new Dictionary<GameObject, float> ();

	public UnrealDistanceComparer (Vector3 zeroPoint)
	{
		this._zeroPoint = zeroPoint;
	}

	public override int Compare (GameObject go1, GameObject go2)
	{
		if (go1 == null && go2 == null) {
			return 0;
		}
		if (go1 == null) {
			return -1;
		}
		if (go2 == null) {
			return 1;
		}
		float distance1;
		float distance2;

		if (dic_GoToZeroDistance.ContainsKey (go1)) {
			distance1 = dic_GoToZeroDistance [go1];
		} else {
			distance1 = Vector3.Distance (go1.transform.position, _zeroPoint);
		}
		if (dic_GoToZeroDistance.ContainsKey (go2)) {
			distance2 = dic_GoToZeroDistance [go2];
		} else {
			distance2 = Vector3.Distance (go2.transform.position, _zeroPoint);
		}

		if (distance1 < distance2) {
			return -1;
		}

		if (distance1 > distance2) {
			return 1;
		}
		return 0;
	}
}

使用方法:allEnemies是一个list类型

allEnemies.Sort (new UnrealDistanceComparer (transform.position));

使用前


使用后


猜你喜欢

转载自blog.csdn.net/yuewei19/article/details/78902496