在进行列表排序时,有个“上移”和“下移”操作,这个一般在内存里完成,然后统一提交到数据库中,对于上移与下移的设计,大叔在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. Java 8函数编程轻松入门

    函数接口介绍 在Java1.8中,新增了Lambda表达式.在.net3.5(C# 3.0)在原先的匿名方法基础上演变出了Lambda表达式.学过C# Lambda表达式的同学,对于Java的Lamb ...

  2. 入手Invicta 8926 OB潜水自动机械腕表

    前个月前就想入手一款手表了,之前在关注和学习.询问他人选哪样的表好,前些天还在看精工Seiko机械表系列,今凌晨有朋友给我推荐这款Invicta 8926系列手表,我一看便喜欢了. 在网上也是搜索了很 ...

  3. mysql 的 VARCHAR VARCHAR2

    mysql 里面竟然没有 VARCHAR2 ??

  4. [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一.

    在这里一下讲解着三个的安装和配置, 是因为solr需要使用tomcat和IK分词器, 这里会通过图文教程的形式来详解它们的安装和使用.注: 本文属于原创文章, 如若转载,请注明出处, 谢谢.关于设置I ...

  5. 2013 duilib入门简明教程 -- 自绘控件 (15)

        在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如 ...

  6. MongoDB 之C#实践

    官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads.下载后,还提供了一个酷似msdn的帮助文档. samus驱动:https:/ ...

  7. 日志log2

    public class LoggerHelper2 { private static ConcurrentQueue<string> CqMsg = null; private stat ...

  8. UITableView 一直显示滚动条(ScrollBar Indicators)、滚动条Width(宽度)、滚动条Color(颜色)

    在 IOS 中,对 UIScrollView 的滚动条(ScrollBar Indicators)的自定义设置接口,一直都是很少的.除了能自定义简单的样式(UIScrollViewIndicatorS ...

  9. 【原创】开源Math.NET基础数学类库使用(14)C#生成安全的随机数

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

  10. ASP.NET WebAPi之断点续传下载(下)

    前言 上一篇我们穿插了C#的内容,本篇我们继续来讲讲webapi中断点续传的其他情况以及利用webclient来实现断点续传,至此关于webapi断点续传下载以及上传内容都已经全部完结,一直嚷嚷着把S ...