通過上面的類別圖可以基本了解實現的結構,MoveSeqArithmeticItem 是移動順序演算法中的資料元素實體,其中 Obj 是資料物件,ObjKey 是資料物件中的關鍵 ID,其實該類別就是中間的一個包裝,只是提供了排序欄位 Seq 和 AfterSetSequenceEvent 事件(設定序號後觸發的事件)。
MoveSeqArithmetic 是演算法的核心,需要特別說明下的是 SequenceAreaEntity 類別,該類別是資料集合中連續區域物件的結構,目的是方便對於多個連續或不連續的資料進行操作。MoveSeqArithmetic 中移動的具體實現還是看下面的圖更加清晰,

核心程式碼:MoveUpByKeys
/// <summary>
/// 將資料元素全部向上移動
/// </summary>
/// <param name="objKeys">物件關鍵字</param>
public void MoveUpByKeys(object[] objKeys)
{
#region 預處理
if (objKeys == null)
{
return;
}
#endregion
Hashtable hs = this.GetSequenceAreasByKeys(objKeys);
foreach (DictionaryEntry h in hs)
{
SequenceAreaEntity o = (SequenceAreaEntity)h.Value;
// 移動的資料
MoveSeqArithmeticItem<T, K> moveItem = this.GetPrevViewItemByArea(o);
if (moveItem != null)
{
int moveIndex = moveItem.Seq;
int fIndex = o.FItem.Seq;
int lIndex = o.LItem.Seq;
foreach (MoveSeqArithmeticItem<T, K> entry in o.ArrAreas)
{
entry.Seq = entry.Seq - fIndex + moveIndex;
}
moveItem.Seq = lIndex;
o.FItem.PreviewItem = moveItem.PrevViewItem;
moveItem.PrevViewItem = o.LItem;
moveItem.BackItem = o.LItem.BackItem;
o.LItem.BackItem = moveItem;
}
}
this.Sort();
}