最近发现写程序不是简单的实现功能,过程中偶尔伴随者一点小小的算法,比如排序算法,比如周期性的数据等等,发现算法不仅仅需要考虑全面,而且要计算简便、性能优良,而我远远没有达到要求!

一:周、月固定日期

        /// <summary>
/// 保洁计划按周获取日期
/// </summary>
/// <param name="startDate">开始时间</param>
/// <param name="endDate">结束时间</param>
/// <param name="date">周开始日期</param>
/// <returns></returns>
public List<DateTime> GetListDatekForCleanPlan(DateTime startDate, DateTime endDate, int date, int cycle)
{
//算法:通过计算开始时间(startdate)与规定开始周期(date)的差
// 将开始时间增加至第一个周期的开始时间,然后循环得出每周的一个时间
//周:每周按照七天计算
//月:需要考虑最大天数不一致,原则采用设置天数和最大天数的比较值
//计算开始时间和规定时间之间的差值 List<DateTime> listdate = new List<DateTime>();
if (cycle == )//周
{
int dayString = (int)startDate.DayOfWeek - date;
//将开始时间增加到第一个周期的第一天
if (dayString >= )
{
startDate = startDate.AddDays( - dayString);
}
else
{
startDate = startDate.AddDays(-dayString);
}
while (startDate <= endDate)
{
if (startDate.Date >= DateTime.Now.Date)
{
break;//今日之前不添加保洁记录
}
listdate.Add(startDate);
startDate = startDate.AddDays();
}
}
else//月
{
int dayString = (int)startDate.Day - date;
if (dayString >= )//本月不加保洁,直接开始下月
{
startDate = Convert.ToDateTime(startDate.Year + "-" + startDate.AddMonths().Month + "-" + startDate.Day);//加一个月
} while (startDate <= endDate)//这里的算法有问题
{ DateTime cleandate = new DateTime();
//判断当月最大天数是否大于指定日期,如果当月没有指定日期就按照最大一天安排打扫
if (date <= DateTime.DaysInMonth(startDate.Year, startDate.Month))
{
cleandate = Convert.ToDateTime(startDate.Year + "-" + startDate.Month + "-" + date);
}
else
{
cleandate = Convert.ToDateTime(startDate.Year + "-" + startDate.Month + "-" + DateTime.DaysInMonth(startDate.Year, startDate.Month));
}
if (cleandate.Date <= DateTime.Now.Date)
{
startDate = startDate.AddMonths();
continue;//今日之前不添加保洁记录
}
listdate.Add(cleandate);
startDate = startDate.AddMonths();
}
}
return listdate;
}

这个写法待整理


二:上下排序算法

在一个小功能中用到,需要对列表展示数据可上移一位可下移一位,而且考虑可用与不可用属性

修改排序:

 /// <summary>
/// 支付方式排序
/// </summary>
/// <param name="ID">当前id</param>
/// <param name="isUp">true->上移;false->下移</param>
/// <returns></returns>
public bool ChangePaymentTypeLevel(int ID, bool isUp)
{
//排序分为两部分,第一:有效记录中可以对记录上移一位和下移一位
//第二:无效记录重新排序,排在有效记录后
//通过两个规则完成,无效记录在后,有效记录在前,可以对有效记录调整顺序的操作
try
{
using (var trans = new TransactionScope())
{
using (var dbContext = new ConfigDbContext())
{
var commerid = ConfigManager.GetCurrentLoginInfoCommercialTenantID();//商户id
IEnumerable<PaymentType> paymentlist = dbContext.PaymentType.Where(p => p.CommercialTenantID == commerid).OrderBy(p => p.Level).ToList();//全部记录
var status = (byte)EnumPaymentTypeStatus.valid;//有效状态
var thispayment = paymentlist.Where(p => p.ID == ID).FirstOrDefault();//本条记录
if (paymentlist != null && thispayment != null && thispayment.Status == status)
{
var paymentstatuscount = paymentlist.Where(p => p.Status == status).Count();//总记录数
if ((thispayment.Level < paymentstatuscount && !isUp) || thispayment.Level != && isUp)//上升和下降的时候都不是不可操作的那一个
{
//对本身和相邻记录进行调换等级(排序)start
var thislevel = thispayment.Level;//本等级
byte changelevel = ;//需要改变的等级,上移时意味着上一条记录的等级,下移时意味着下一条记录的等级,这里通过等级去寻找记录
if (isUp)//上移
{
changelevel = Convert.ToByte(thispayment.Level - );//上一条记录等级
}
else//下移
{
changelevel = Convert.ToByte(thispayment.Level + );//下一条记录等级
}
var changepayment = paymentlist.Where(p => p.Level == changelevel).FirstOrDefault();//需要改变的记录
dbContext.PaymentType.Where(p => p.ID == changepayment.ID).Update(p => new PaymentType() { Level = thislevel });//改变相邻记录等级
dbContext.PaymentType.Where(p => p.ID == thispayment.ID).Update(p => new PaymentType() { Level = changelevel });//改变本条记录等级
//对本身和相邻记录进行调换等级(排序)end //修改剩余支付类型排序,自增长
var otherpayment = paymentlist.Where(p => p.Status != status).ToList();//获取无效状态的记录
foreach (var item in otherpayment)
{
item.Level = (byte)(otherpayment.IndexOf(item) + + paymentstatuscount);//修改排序等级自增长:本身位数加总的有效状态总数
dbContext.Update(item,false);
}
dbContext.SaveChanges();
trans.Complete();
return true;
}
else
{
//无聊的客户将最后一个有效的支付方式下移,告诉他成功了!
//第一个还要上移,告诉他成功了!
//页面最后对第一条和最后一条进行了限制不能修改排序(删除排序操作按钮,哈哈)
return true;
}
}
else
{
//有效且是第一个
return false;
}
}
}
}
catch (Exception es)
{
return false;
}
}

修改状态-调整排序

/// <summary>
/// 更新支付类型状态
/// </summary>
/// <param name="ID"></param>
/// <returns></returns>
public bool ChangePaymentTypeStatus(int ID)
{
//1:修改有效状态的排序
//2:修改本身记录的排序
//3:修改无效状态的排序
//4:本记录不在有效无效列表记录中计算
try
{
using (TransactionScope scope = new TransactionScope())
{
using (var dbContext = new ConfigDbContext())
{
var paymenttype = dbContext.PaymentType.Find(ID);//本条记录
if (paymenttype != null)
{
//实时的状态信息,不考虑并发,状态转换
var status = paymenttype.Status == (byte)EnumPaymentTypeStatus.valid ? (byte)EnumPaymentTypeStatus.invalid : (byte)EnumPaymentTypeStatus.valid;
var commerid = ConfigManager.GetCurrentLoginInfoCommercialTenantID();//商户id
var paymentlist = dbContext.PaymentType.Where(p => p.CommercialTenantID == commerid).ToList();//全部列表
//有效且非本身按照等级排序
var paymentstatuslist = paymentlist.Where(p => p.Status == (byte)EnumPaymentTypeStatus.valid & p.ID != ID).OrderBy(p => p.Level).ToList();
//有效状态,从1开始重新排序
foreach (var item in paymentstatuslist)
{
item.Level = (byte)(paymentstatuslist.IndexOf(item) + );
dbContext.Update(item, false);
}
dbContext.SaveChanges();
//本身这条记录的排序,等于除了本身之外的有效状态总数加1
dbContext.PaymentType.Where(p => p.ID == ID).Update(p => new PaymentType() { Status = status, Level = (byte)(paymentstatuslist.Count() + ) });
//无效状态除本条记录列表
var paymentinvalidlist = paymentlist.Where(p => p.Status == (byte)EnumPaymentTypeStatus.invalid & p.ID != ID).OrderBy(p => p.Level).ToList();
foreach (var item in paymentinvalidlist)
{
item.Level = (byte)(paymentinvalidlist.IndexOf(item) + + paymentstatuslist.Count() + );
dbContext.Update(item, false);
}
dbContext.SaveChanges();
scope.Complete();
return true;
}
else
{
return false;
}
}
}
}
catch (Exception)
{
return false;
}
}


C# 计算每周和每月固定日期的更多相关文章

  1. PHP计算每月几周,每周的开始结束日期

    PHP计算每月几周,每周的开始结束日期 因为项目中需要一个每周工作计算的功能,具体日期的算法是,把每月拆分成几个周,最后一个星期这个月份的天数不够就补上下个月的. 列如今天8月27星期一,这个月有31 ...

  2. PHP获取一年有多少周和每周开始和结束日期

    /*PHP获取当前日期是第几周和本周开始日期和本周结束日期*/ //$now = '2018-11-13';周二 public function getNowTimeInfo($now) { $str ...

  3. My97DatePicker日历控件日报、每周和每月的选择

    My97DatePicker日历控件日报.每周和每月的选择 1.设计源代码 <%@ page language="java" import="java.util.* ...

  4. 前端yyyy-mm-dd格式 计算一段工作日后,日期

    //计算一段工作日后,日期getWorkday(dat, itervalByDay) { function formatTen(f) { if (parseInt(f, 10) < 10) { ...

  5. C#中得到每周,每月,每季,每年的年初末日期

    DateTime表示时间上的一刻,通常以日期和当天的时间表示.借用这个结构,我们可以实现较丰富的功能,本文给出得到每周每天的方法,及得到本月第一天,本月最后一天,本季第一天,本季最后一天,本年第一天及 ...

  6. cron和crontab命令详解 crontab 每分钟、每小时、每天、每周、每月、每年定时执行 crontab每5分钟执行一次

    cron机制        cron可以让系统在指定的时间,去执行某个指定的工作,我们可以使用crontab指令来管理cron机制 crontab参数        -u:这个参数可以让我们去编辑其他 ...

  7. crontab 每分钟、每小时、每天、每周、每月、每年执行

    每分钟执行 * * * * * 每小时执行 0 * * * * 每天执行 0 0 * * * 每周执行 0 0 * * 0 每月执行 0 0 1 * * 每年执行 0 0 1 1 * 每小时的第3和第 ...

  8. js 获得每周周日到周一日期

    //得到每周的第一天(周日)function getFirstDateOfWeek(theDate){ var firstDateOfWeek; theDate.setDate(theDate.get ...

  9. OpenJudge计算概论-Tomorrow never knows【输入日期计算下一天的日期】

    /*====================================================================== Tomorrow never knows? 总时间限制 ...

随机推荐

  1. 织梦dedecms修改include和plus重命名提高安全性防漏洞注入挂马

    织梦dedecms是新手站长使用得比较多的一个建站开源程序,正因如此,也是被被入侵挂马比较多的程序.下面就来跟大家说一下怎么重新命名dedecms的include文件夹以及plus文件夹来提高网站的安 ...

  2. Latex排版:CTeX winEdit 输出“系统找不到指定的文件”的解决办法)

    winEdit输出“系统找不到指定的文件”,这里“指定的文件”是“TeXify.exe”等需要运行的程序,而不是当前需要编译的“.tex”文件.所以,问题的本质就是系统找不到“TeXify.exe”等 ...

  3. CSS经验库

    1.兼容360浏览器 字体大小设置 开发中需要使用em单位 font-size: 0.83em; font-family: "Arial"; -webkit-text-size-a ...

  4. 扩展方法 DataTable的ToList<T>

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.T ...

  5. CentOS7:gdb出现没有调试信息:Missing Separate debuginfos

    现在刚刚开始学习用gdb调试程序,结果:在centos下,出现这样的错误: gdb在调试程序时候提示 Missing separate debuginfos, use: debuginfo-insta ...

  6. Mac Yosemite上安装macvim和YouCompleteMe

    今天在macvim上安装YouCompleteMe的时候,碰到一个运行vim崩溃的错误.查了半天终于解决! 先上一下安装macvim的过程 # install xcode and command li ...

  7. maven下载源码和java docs

    方法一: mvn dependency:sources mvn dependency:resolve -Dclassifier=javadoc The first command will attem ...

  8. python学习之items()

    定义 Python 字典 items() 方法以列表返回可遍历的(键, 值) 元组数组. 语法 dict.items() 说明:没有参数. 返回值 返回可遍历的(键, 值) 元组数组. 例子 > ...

  9. 13个实用的Apache Rewrite重写规则

    1.去掉域名中的www标记 复制代码 代码如下: RewriteCond %{HTTP_HOST} !^jb51\.net$ [NC]RewriteRule .? http://jb51.net%{R ...

  10. 使用 xlue 实现简单 listbox 控件

    基于 XLUE 实现的 listbox 控件 1. 提供增删查接口,将 obj 作为子控件添加到列表: 2. 提供 Attach/Detach 方法,可以将子控件的事件转发出来: 3. 支持滚动条: ...