程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#實現簡單的數據移動算法

C#實現簡單的數據移動算法

編輯:關於C#

最近一直都在忙於項目的版本開發,現在終於有時間閒下來寫點東西了!

數據移動算法,其實是一個比較簡單的程序,當移動的數據是一個的時候,只是移動的數據和被移動的數據相互交換下排序值Seq就可以了,不過當移動的數據不止一個的時候,有多個數據,而且這些數據可能是連續的,也可能是不連續的,這個時候雖然也不復雜,但是還是有點煩瑣的。前段時間我正好碰到了個這樣的需求,就寫了個比較通用的算法。

算法效果演示:

1、在上述的數據中,同時向上移動[Key0]、[Key2,Key3,Key4]、[Key9]這三部分數據

2、在上述的數據中,同時向下移動[Key0]、[Key1,Key2,Key3]、[Key9]這三部分數據

算法代碼分析:

通過上面的類圖可以基本了解實現的結構,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.GetPreviewItemByArea(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.PreviewItem;
             moveItem.PreviewItem = o.LItem;
             moveItem.BackItem = o.LItem.BackItem;
             o.LItem.BackItem = moveItem;
         }
     }

     this.Sort();
}

詳細的代碼下載下面的代碼項目進行了解。

測試DEMO:

/// <summary>
/// 向上移動
/// </summary>
private static void StartTestDataStructMoveUp()
{
     Console.WriteLine("-------------待排序的數據--------------");

     List<MoveSeqArithmeticItem<object, string>> list = new List<MoveSeqArithmeticItem<object, string>>();
     for (int i = 0; i < 10; i++)
     {
         MoveSeqArithmeticItem<object, string> o = new MoveSeqArithmeticItem<object, string>(i, string.Format("key{0}", i), null);
         list.Add(o);
     }

     //構造數據結構,並加入數據
     MoveSeqArithmetic<object, string> s = new MoveSeqArithmetic<object, string>(list.ToArray<MoveSeqArithmeticItem<object, string>>());

     //向上移動數據
     s.MoveUpByKeys(new object[] { "key0" });
     s.MoveUpByKeys(new object[] { "key2", "key3", "key4" });
     s.MoveUpByKeys(new object[] { "key9" });

     //打印
     foreach (MoveSeqArithmeticItem<object, string> item in s.ArrList)
     {
         Console.WriteLine(string.Format("Seq: {0} --- Key: {1}", item.Seq, item.ObjKey));
     }
}

執行結果上面已經展示。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved