做之前是一点灵感没有的 看了下别人的做法 数据库,设置浮点字段做排序序号,实现自定义排序
我仿照的做下来 Sort 字段改为 Float 类型
后面在 写代码的时候就发现一点点问题
每次移动位置就会小数点后面加一位这样感觉就不完美了
而且有几率我要插入的位置 上下两个的 排序值是一样的 导致取出的 中间值也是一样的 ,这就很烦了,谁排在前面还不一定呢
/// <summary>
/// 计算排序中间值
/// 如果小数点位数比beforeValue 和 nextValue 都长 就四舍五入
/// 这里有风险 返回值 = nextValue 数据库排序规则 上加了辅助字段 最后修改时间 ORDER BY [Sort] desc , LastModified desc 即便一样的 sort值会以时间优先 也添加响应的索引
/// 如果小数点位数比 beforeValue 和 nextValue 都小 直接返回
/// </summary>
/// <param name="beforeValue">数字较大的那个</param>
/// <param name="nextValue">数字较小的那个</param>
/// <returns>中间值</returns>
private double DealSortMiddleValue(double beforeValue, double nextValue)
{
if (beforeValue == 0 && nextValue == 0)
{
return 0;
}
else if (beforeValue == 0)
{
return nextValue + 1;
}
else if (nextValue == 0)
{
return beforeValue - 1;
}
else
{
// 避免每次插入都增加一个小数位
// 这里获取小数位较大的那个进行保留位数处理
var beforeAccuracy = GetAccuracy(beforeValue);
var nextAccuracy = GetAccuracy(nextValue);
var maxAccuracy = nextAccuracy > beforeAccuracy ? nextAccuracy : beforeAccuracy;
var middleValue = (beforeValue + nextValue) / 2;
var middleAccuracy = GetAccuracy(middleValue);
if (middleAccuracy > maxAccuracy)
{
return Math.Round(middleValue, maxAccuracy);
}
else
{
return middleValue;
}
}
}
// 计算数字有多少位小数
private int GetAccuracy(double value)
{
string strValue = value.ToString();
if (strValue.Contains("."))
{
int maxLength = strValue.Length;
int index = strValue.IndexOf(".");
return maxLength - 1 - index;
}
else
{
return 0;
}
}
后面想到了 我的这个修改时间字段 每次修改排序我都会更新时间
拿这个 字段 和 Sort 做一个联合索引
排序的时候就按照这样排序就OK了 即便我的值和其他条数据的 sort 是一样的,但是 我的 LastModified 肯定比其他的时间要大
ORDER BY [Sort] desc , LastModified desc