C#虽然提供了排序方法但是规则比较单一而且较难扩展,对于一个复杂结构集合使用起来不是很方便。
例如:
在实现报警设备周围摄像头显示功能时,遇见一个难题:即,在规定距离范围内若没有摄像头点位时,需对当前楼层点位列表进行排序找到一个里报警点最近的摄像头点位进行显示,于是使用冒泡排序封装了一个泛型排序方法便于使用也便于扩展,上代码:
//泛型冒泡排序
public static void BubblingSort<T>(IList<T> sortArray, Func<T, T, bool> comparison)
{
bool swapped = true;
do
{
swapped = false;
for (int i = 0; i < sortArray.Count - 1; i++)
{
if (comparison(sortArray[i + 1], sortArray[i]))
{
T temp = sortArray[i];
sortArray[i] = sortArray[i + 1];
sortArray[i + 1] = temp;
swapped = true;
}
}
} while (swapped);
}
使用例子如下:
//视频点位
List<ShiPinSerData> datas
//目标位置
Vector3 pos
CustomExtention.BubblingSort(datas, (ShiPinSerData a, ShiPinSerData b) =>
{
string cameraPosition0 = a.position;
string cameraPosition1 = b.position;
Vector3 CameraPosition0 = Vector3.zero;
Vector3 CameraPosition1 = Vector3.zero;
float diantance0 = 0;
float diantance1 = 0;
///将字符串转化为Vector3转化成功为true
if (StringUtils.GetVector3FromString(cameraPosition0, out CameraPosition0))
{
diantance0 = Vector3.Distance(pos, CameraPosition0);
}
if (StringUtils.GetVector3FromString(cameraPosition1, out CameraPosition1))
{
diantance1 = Vector3.Distance(pos, CameraPosition1);
}
//排序规则
return diantance0 <diantance1;
});
即可按照自定义规则将datas进行排序,找到里pos最近的摄像点位