在进行列表排序时,有个“上移”和“下移”操作,这个一般在内存里完成,然后统一提交到数据库中,对于上移与下移的设计,大叔在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 += ;
} }
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 -= ;
}
}
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=,Name="zzl",SortNumber=});
list.Add (new Person {ID=,Name="zzl2",SortNumber=});
list.Add (new Person {ID=,Name="zzl3",SortNumber=}); Console.WriteLine ("Hello World!");
Extenstion.Sortable (list, , );
Extenstion.Sortable (list, , ); }
}


单元测试里的结果如图
aaarticlea/png;base64,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" alt="" />
感谢各位中秋阅读!

Lind.DDD.Domain.ISortBehavor~上移与下移的更多相关文章

  1. Lind.DDD.Domain.IOwnerBehavor对实体的意义

    回到目录 对于Lind.DDD架构,我之前写了不少文章,对于它的Domain模式也介绍了不少,像之前的IEntity,ILogicDeleteBehavor,IModifyBehavor,IStatu ...

  2. Lind.DDD.Domain领域模型介绍

    回到目录 Lind.DDD.Domain位于Lind.DDD核心项目中,它主要面向领域实体而设计,由一个IEntity的标识接口,EntityBase基类和N个Entity实体类组成,其中IEntit ...

  3. Lind.DDD敏捷领域驱动框架~介绍

    回到占占推荐博客索引 最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要 ...

  4. Lind.DDD.ILogicDeleteBehavor~逻辑删除的实现

    回到目录 关于逻辑删除 对于逻辑删除之前的做法是在实体类中加个字段,一般是status,其中一种状态是删除,当然也有其它做法,如加个bool的字段IsDeleted,这些其实都过于武断,即它在基类里加 ...

  5. Lind.DDD敏捷领域驱动框架~Lind.DDD各层介绍

    回到目录 Lind.DDD项目主要面向敏捷,快速开发,领域驱动等,对于它的分层也是能合并的合并,比之前大叔的框架分层更粗糙一些,或者说更大胆一些,在开发人员使用上,可能会感觉更方便了,更益使用了,这就 ...

  6. Lind.DDD.LindAspects方法拦截的介绍

    回到目录 什么是LindAspects 之前写了关于Aspects的文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>,今天主要在设计思想上进 ...

  7. Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP

    回到目录 .Net MVC之所以发展的如些之好,一个很重要原因就是它公开了一组AOP的过滤器,即使用这些过滤器可以方便的拦截controller里的action,并注入我们自己的代码逻辑,向全局的异常 ...

  8. Lind.DDD.Plugins~插件模式的集成

    回到目录 对于Lind.DDD这个敏捷框架来说,插件也是其中的一个亮点,所有被认为是插件(Plugins)的模块都会继承自IPlugins这个标示接口,它在程序启动时会找到所有插件,并通过autofa ...

  9. Lind.DDD.SSO单点登陆组件的使用(原创)

    回到目录 一般sso的说明 在Lind.DDD框架里,有对单点登陆的集成,原理就是各个网站去sso网站统一登陆授权,之后在sso网站将登陆的token进行存储,存储方式随你(cache,redis,m ...

随机推荐

  1. TDR测试原理

    什么是TDR? TDR是英文Time Domain Reflectometry 的缩写,中文名叫时域反射计,是测量传输线特性阻抗的主要工具.TDR主要由三部分构成:快沿信号发生器,采样示波器和探头系统 ...

  2. SVN+码云 简单使用流程

    1.登录码云网站...

  3. Atitit.创业之uke团队规划策划 v9

    Atitit.创业之uke团队规划策划 v9 Uke  org prjAuthor撰写人:绰号:老哇的爪子( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努 ...

  4. Vue脚手架工具vue-cli和调试组件vue-devtools

    https://github.com/vuejs/vue-cli npm install vue-cli -g vue init webpack my-project cd my-project // ...

  5. Angular使用$compile为从Ajax加载的HTML绑定ng-click事件

    这是一个Angular使用$compile为从Ajax加载的HTML绑定ng-click事件的实现方式,由于近期忙碌,就先放代码.代码如下: <table data-ng-table=" ...

  6. SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  7. 深入学习jQuery元素尺寸和位置操作

    × 目录 [1]尺寸设置 [2]位置设置 前面的话 对于javascript来说,元素尺寸有scroll.offset.client三大属性,以及一个强大的getBoundingClientRect( ...

  8. 深入理解脚本化CSS系列第一篇——脚本化行内样式

    × 目录 [1]用法 [2]属性 [3]方法 前面的话 脚本化CSS,通俗点说,就是使用javascript来操作CSS.引入CSS有3种方式:外部样式,内部样式和行间样式.本文将主要介绍脚本化行间样 ...

  9. php继承多态

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 【原创】开源Math.NET基础数学类库使用(03)C#解析Matlab的mat格式

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...