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

一:周、月固定日期

        /// <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. nginx location静态文件配置

    进入nginx安装目录的conf目录下,修改nginx.conf文件,在一个server{}中添加 一个location 部分配置代码如下 root@ubuntu:/usr/local/nginx/c ...

  2. 年关了,抛一个模拟ip刷票的php程序

    <?php $ip = $_GET['ip'] ? $_GET['ip'] : '1.1.1.1'; $ipArr = explode(".", $ip); $ipArr[3 ...

  3. Image.Save出错 GDI 一般错误

    一般是路径问题 需要转化为绝对路径 \转换为/ if (HttpContext.Current!=null) outPath = HttpContext.Current.Server.MapPath( ...

  4. VS2015 经常不出现智能提示,代码颜色也没有了

    重置下.开始菜单 -->所有程序-->Visual Studio 文件夹 --> Visual Studio Tools --> Developer Command Promp ...

  5. wpf 帧动画

    帧动画实现很简单 <ImageBrush x:Key="speed_s" Stretch="Fill" ImageSource="/images ...

  6. zookeeper(二):linux centos下安装zookeeper(单机和集群)

    下载 http://zookeeper.apache.org/releases.html 解压 tar –zxvf zookeeper-3.4.6.tar.gz 解压文件到"/usr/loc ...

  7. .Net MVC ViewBag

    ViewBag用来做视图的值绑定,我不清楚是不是这么称呼.之前看过安卓的值绑定做法,mvc直接动态类型,瞬间逼格满满 Controller: public class HomeController : ...

  8. Atitit.跨语言异常转换机制 java c# php到js的异常转换

    Atitit.跨语言异常转换机制 java c# php到js的异常转换 1. bizEx   直接抓取,然后js catchEX1 2. Chkec runtimeEx1 3. Other异常..J ...

  9. atitit.提升兼容性最佳实践 p825.doc

    atitit.提升兼容性最佳实践 p825.doc 1. Atitit.兼容性的“一加三”策略1 2. 扩展表模式2 3. 同时运行模式2 3.1. 完美的后向兼容性3 3.2. 虚拟机模式3 3.3 ...

  10. TextView中超链接拦截

    TextView中的超链接点击时,其实是通过Intent方式的,因此会调用Activity中的startActivity(Intent intent)方法,所以可在此方法中做些简单的拦截操作 例如拦截 ...