在进行列表排序时,有个“上移”和“下移”操作,这个一般在内存里完成,然后统一提交到数据库中,对于上移与下移的设计,大叔在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. Python框架之Tornado(四)源码之褪去模板外衣的前戏

    执行字符串表示的函数,并为该函数提供全局变量 本篇的内容从题目中就可以看出来,就是为之后剖析tornado模板做准备,也是由于该知识点使用的巧妙,所有就单独用一篇来介绍了.废话不多说,直接上代码: # ...

  2. android/java 根据当前时间判断股票交易状态(未开盘 交易中 休市中 已收盘)

    /** * @param data yyyy-MM-dd HH:mm:ss 时间 * @return 未开盘 交易中 休市中 已收盘 */ public static String getSotckS ...

  3. 面向对象设计之SRP(单一职责)原则

    SRP设计原则面向对象类设计的第一个原则,最优先考虑的因素 一个类应该有且仅有一个职责.所谓一个类的职责是指引起该类变化的原因,如果一个类具有一个以上的职责,那么就会有多个不同的原因 引起该类变化,其 ...

  4. 没有Hyper-V服务,WP Emulator无法启动

    解决: 打开管理工具

  5. LINQ系列:LINQ to DataSet的DataView操作

    1. 创建DataView EnumerableRowCollection<DataRow> expr = from p in products.AsEnumerable() orderb ...

  6. float实例讲解

    float实例讲解 float是个强大的属性,在实际前端开发过程中,人们经常拿它来进行布局,但有时,使用的不好,也麻烦多多啊. 比如,现在我们要实现一个两列布局,左边的列,宽度固定:右边的列,宽度自动 ...

  7. mysqldump的实现原理

    对于MySQL的备份,可分为以下两种: 1. 冷备 2. 热备 其中,冷备,顾名思义,就是将数据库关掉,利用操作系统命令拷贝数据库相关文件.而热备指的是在线热备,即在不关闭数据库的情况下,对数据库进行 ...

  8. C# 设置word文档页面大小

    我们知道,在MS word中,默认的页面大小是letter(8.5’’x11’’),除此之外,word还提供了其他一些预定义的页面大小,如Legal (5.4’’x14’’),A3 (11.69’’x ...

  9. 淘宝web前端开发岗面试经历及感悟

    今天下午四点接到淘宝UED的面试电话,很突然,很激动.现在怀着淡淡的忧伤为之文以志一下. 1.自我介绍一下. 我xx时候毕业,在xx公司任xx职务,主要负责xx balabala.(怕公司同事听到,接 ...

  10. Android-Universal-Image-Loader 图片异步加载类库的使用

    在博客中看到一篇利用组件进行图片异步加载的文章在此作记录 原文:http://blog.csdn.net/vipzjyno1/article/details/23206387 这个图片异步加载并缓存的 ...