zoukankan      html  css  js  c++  java
  • Lind.DDD.Domain.ISortBehavor~上移与下移

    在进行列表排序时,有个“上移”和“下移”操作,这个一般在内存里完成,然后统一提交到数据库中,对于上移与下移的设计,大叔在LIND.DDD.DOMAIN里有一个ISortBehavor接口,主要是说,如果实体对象支持排序功能,可以实现这个接口,而在扩展库中,将有为本地结果集动态排序(上移和下移)的方法,这个设计类似于ABP项目里的软删除,当然在大叔LIND里也有对删除的逻辑操作。

    ISortBehavor内容

    class Entity { public int ID{ get; set; } }
    
    interface ISortBehavor { int SortNumber{ get; set; } }

    而上移与下移我们使用一个泛型方法来接收参数,这样扩展性更好一些,开发人员只要把需要上下移的集合传到方法里,之后你的集合就可以被排序,当然这里面会进行各个元素的移动操作!

      /// <summary>
        /// 算法帮助类
        /// 作者:仓储大叔
        /// </summary>
        public class AlgorithmsHelper
        {
            /// <summary>
            /// 排序,上移和下移
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="list"></param>
            /// <param name="id"></param>
            /// <param name="newSort"></param>
            public static void Sortable_Up_Down<T>(List<T> list, int id, int newSort) where T : class
            {
    
                var old = list.Find(i => (i as Entity).Id == id);
                if (old == null || (old as ISortBehavor).SortNumber == newSort)
                    return;
    
    
                if ((old as ISortBehavor).SortNumber > newSort)
                {
                    (old as ISortBehavor).SortNumber = newSort;
    
                    foreach (ISortBehavor item in list.FindAll(i => (i as Entity).Id != id && (i as ISortBehavor).SortNumber >= newSort))
                    {
    
                        item.SortNumber += 1;
                    }
    
                }
                else
                {
                    (old as ISortBehavor).SortNumber = newSort;
    
    
                    foreach (ISortBehavor item in list.FindAll(i => (i as Entity).Id != id && (i as ISortBehavor).SortNumber <= newSort))
                    {
    
                        item.SortNumber -= 1;
                    }
                }
                list.ForEach(i =>
                {
                    Console.WriteLine((i as Entity).Id + "sort:" + (i as ISortBehavor).SortNumber);
                }
                );
            }
        }

    我们测试一下程序,看一下神奇的结果

    
    
      class MainClass
        {
            public static void Main (string[] args)
            {
                List<Person> list = new List<Person> ();
                list.Add (new Person {ID=1,Name="zzl",SortNumber=1});
                list.Add (new Person {ID=2,Name="zzl2",SortNumber=2});
                list.Add (new Person {ID=3,Name="zzl3",SortNumber=3});
    
                Console.WriteLine ("Hello World!");
                Extenstion.Sortable (list, 1, 2);
                Extenstion.Sortable (list, 2, 3);
    
            }
        }
    
    
    
    
    单元测试里的结果如图
    感谢各位中秋阅读!

     

  • 相关阅读:
    LeetCode 258 Add Digits
    LeetCode 231 Power of Two
    LeetCode 28 Implement strStr()
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 21 Merge Two Sorted Lists
    LeetCode 20 Valid Parentheses
    图形处理函数库 ImageTTFBBox
    php一些函数
    func_get_arg(),func_get_args()和func_num_args()的用法
    人生不是故事,人生是世故,摸爬滚打才不会辜负功名尘土
  • 原文地址:https://www.cnblogs.com/lori/p/5874971.html
Copyright © 2011-2022 走看看