在进行列表排序时,有个“上移”和“下移”操作,这个一般在内存里完成,然后统一提交到数据库中,对于上移与下移的设计,大叔在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. 开源一个练手小App, PrintableCheckList

    A small but powerful App, only focus on one thing, make you easy to print out your checklist. It is ...

  2. xamarin 手机顶部状态栏

    修改显示xamarin开发的App的手机顶部状态栏, 步骤一:在项目UWP上的“引用”里右键“添加引用”,选择->Universal Windows->Windows Mobile Ext ...

  3. sun.misc.BASE64Encoder找不到jar包的解决方法

    1.右键项目->属性->java bulid path->jre System Library->access rules->resolution选择accessible ...

  4. Zabbix实现微信报警

    一.  申请企业微信账号,申请地址 https://qy.weixin.qq.com/ 二. 登陆企业微信账 图一 图二 2.添加微信账号 图一 图二 完成以上步骤后 就完成了微信账号的添加 三.新建 ...

  5. sizzle编译函数

    一个人去完成一件事情,如果派多个人去做的话,只要配合默契,效率比一个人做肯定要高,效率提高,所需的时间就减少了.如果只能一个人完成,那么必须设法提高自己的劳动效率,这个提高可以是量的改变也可以是质的改 ...

  6. 传智播客--数据绑定--INotifyPropertyChanged(小白内容)

    INotifyPropertyChanged一般在数据绑定的时候使用. InotifyPropertyChanged是.net内置的接口,数据绑定时会检测DataContext是否实现了Inotify ...

  7. 深入理解javascript中的动态集合——NodeList、HTMLCollection和NamedNodeMap

    × 目录 [1]NodeList [2]HTMLCollection [3]NamedNodeMap[4]注意事项 前面的话 一说起动态集合,多数人可能都有所了解.但是,如果再深入些,有哪些动态集合, ...

  8. 【开源】OSharp3.0框架解说系列:新版本说明及新功能规划预览

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  9. Web APi入门之Self-Host寄宿及路由原理(二)

    前言 刚开始表面上感觉Web API内容似乎没什么,也就是返回JSON数据,事实上远非我所想,不去研究不知道,其中的水还是比较深,那又如何,一步一个脚印来学习都将迎刃而解. Self-Host 我们知 ...

  10. Netty介绍

    Netty是由JBOSS开发的高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输等协议的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Li ...