文档章节

C#扩展方法

捍卫机密
 捍卫机密
发布于 2017/04/01 18:13
字数 1333
阅读 18
收藏 0
C#

这些个方法都是为了 更方便的提取时间

 

#region --通用扩展方法--
    /// <summary>
    /// 扩展方法
    /// </summary>
    public static class ExpandFunc
    {
        #region --移除指定或者保留指定--

        /// <summary>
        /// 移除或者保留元素 :
        /// isRemove=true, predicate为true时会移除;
        /// isRemove=false, predicate为true时会保留(predicate为false时会移除);
        /// 改变了原始数据,请小心使用,否则会发生“另程序员毛骨悚然的恐怖错误”!
        /// </summary>
        /// <typeparam name="T">具体类型</typeparam>
        /// <param name="self">IList扩展</param>
        /// <param name="isRemove">是否移除,条件成功移除,反之,条件成功保留</param>
        /// <param name="predicate">判断谓词</param>
        public static void RemoveOrHold<TSource>(this IList<TSource> self, bool isRemove, Func<TSource, bool> predicate)
        {
            if (self != null && self.Any())
            {
                int count = self.Count();
                for (int i = count - 1; i >= 0; i--)
                {
                    var item = self.ElementAt(i);
                    if (predicate != null)
                    {
                        var predicateResult = predicate(item);
                        if (isRemove && predicateResult)
                            self.RemoveAt(i);
                        else if (!isRemove && !predicateResult)
                            self.RemoveAt(i);
                    }
                }
            }
        }

        #endregion --移除指定或者保留指定--

        #region --简化验证--

        /// <summary>
        /// string.IsNullOrWiteSpace的简化版
        /// 支持检测null的字符类型(好tm强大)
        /// </summary>
        /// <param name="self"></param>
        /// <returns></returns>
        public static bool NullEmpty(this string self)
        {
            return string.IsNullOrWhiteSpace(self);
        }

        /// <summary>
        /// 直接不为空检测 就是 是否空的取反
        /// 不为空返回True,方便直接使用,无需 取反(!)
        /// string.IsNullOrWiteSpace的简化版 
        /// </summary>
        /// <param name="self"></param>
        /// <returns></returns>
        public static bool NotNullEmpty(this string self)
        {
            return !self.NullEmpty();
        }
        #endregion --简化验证--

        #region --检查对象是否null--
        /// <summary>
        /// 检查对象是否null
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="self"></param>
        /// <returns></returns>
        public static bool IsNull<T>(this T self)
        {
            return ReferenceEquals(self, null);
        }
        #endregion --检查对象是否null--

        #region --创建一个属于 IList 的 foreach循环--

        /// <summary>
        /// 创建一个属于 IList 的 foreach循环
        /// </summary>
        /// <typeparam name="TData">容器内实体</typeparam>
        /// <param name="self">队列容器</param>
        /// <param name="action">执行动作</param>
        public static void Foreach<TData>(this IList<TData> self, Action<TData> action)
        {
            foreach (var item in self)
            {
                action(item);
            }
        }

        #endregion --创建一个属于 IList 的 foreach循环--

        #region --给IList加入AddRange--
        /// <summary>
        /// 给IList加入AddRange
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="self"></param>
        /// <param name="itemList"></param>
        /// <returns></returns>
        public static IList<T> AddRange<T>(this IList<T> self, IList<T> itemList)
        {
            if (itemList == null || !itemList.Any() || self == null)
            {
                return null;
            }
            else
            {
                foreach (var item in itemList)
                {
                    if (!object.Equals(null, item))
                    {
                        self.Add(item);
                    }
                }
            }
            return self;
        }
        #endregion --给IList加入Add--

        #region --返回带index索引的foreach--

        /// <summary>
        /// 返回带index索引的foreach
        /// </summary>
        /// <typeparam name="T">实体</typeparam>
        /// <param name="source">源容器实体</param>
        /// <returns></returns>
        public static IEnumerable<Tuple<int, T>> ForeachForIndex<T>(IEnumerable<T> source)
        {
            for (int i = 0; i < source.Count(); i++)
            {
                var souTemp = source.ElementAt(i);
                yield return new Tuple<int, T>(i, souTemp);
            }
        }

        #endregion --返回带index索引的foreach--

        #region --时间扩展,时间扩展和结构--
        /// <summary>
        /// 根据日期时间返回当月首日
        /// </summary>
        /// <param name="self"></param>
        /// <returns></returns>
        public static DateTime CurrMonthFirstDay(this DateTime self)
        {
            var currMonthFirstDay = new DateTime(self.Year, self.Month, 1);
            return currMonthFirstDay;
        }

        /// <summary>
        /// 根据日期时间返回当月最后一日(23点59分59秒999毫秒999微妙)
        /// </summary>
        /// <param name="self"></param>
        /// <returns></returns>
        public static DateTime CurrMonthLastDay(this DateTime self)
        {
            var lastMonth = self.AddMonths(1);
            // 进到下一月首日(这里定义的是最后 1 毫秒)
            var firstDay = new DateTime(lastMonth.Year, lastMonth.Month, 1, 23, 59, 59, 999);
            // 再回退一天
            var currMonthLastDay = firstDay.AddDays(-1);
            return currMonthLastDay;
        }

        /// <summary>
        /// 根据日期时间返回前一个月最后一日(23点59分59秒999毫秒999微妙)
        /// </summary>
        /// <param name="self"></param>
        /// <returns></returns>
        public static DateTime PreviousMonthLastDay(this DateTime self)
        {
            var thisMonth = self;
            // 进到下一月首日(这里定义的是最后 1 毫秒)
            var firstDay = new DateTime(thisMonth.Year, thisMonth.Month, 1, 23, 59, 59, 999);
            // 再回退一天
            var previousMonthLastDay = firstDay.AddDays(-1);
            return previousMonthLastDay;
        }

        /// <summary>
        /// 根据日期时间返回下月首日
        /// </summary>
        /// <param name="self"></param>
        /// <returns></returns>
        public static DateTime NextMonthFirstDay(this DateTime self)
        {
            var currMonthFirstDay = new DateTime(self.Year, self.Month, 1);
            var nextMonthFirstDay = currMonthFirstDay.AddMonths(1);
            return nextMonthFirstDay;
        }

        /// <summary>
        /// 返回日期时间日期部分
        /// </summary>
        /// <param name="self"></param>
        /// <returns></returns>
        public static string ShortDataStr(this DateTime self)
        {
            var shortDateStr = self.ToString("yyyy-MM-dd");
            return shortDateStr;
        }

        /// <summary>
        /// 返回日期时间完整字符串
        /// </summary>
        /// <param name="self"></param>
        /// <returns></returns>
        public static string FullStr(this DateTime self)
        {
            var shortDateStr = self.ToString("yyyy-MM-dd HH:mmss.fff");
            return shortDateStr;
        }

        /// <summary>
        /// 时间元组转换字符串类型时间元组
        /// </summary>
        /// <param name="self"></param>
        /// <returns></returns>
        public static List<Tuple<string, string>> TupleDateTimeToTupleDateStr(this List<Tuple<DateTime, DateTime>> self)
        {
            List<Tuple<string, string>> monthList = new List<Tuple<string, string>>();
            foreach (var item in self)
            {
                monthList.Add(new Tuple<string, string>(item.Item1.ShortDataStr(), item.Item2.ShortDataStr()));
            }
            return monthList;
        }

        /// <summary>
        /// 计算月限制,默认3月,含当前月
        /// </summary>
        /// <param name="self"></param>
        /// <param name="startDate"></param>
        /// <param name="maxMonth"></param>
        public static void LimitMonthForEndDate(this DateTime self, DateTime startDate, int maxMonth = 3)
        {
            if (maxMonth <= 1) return;
            if (self <= DateTime.MinValue || startDate <= DateTime.MinValue) return;
            DateTime endDate = self;

            int maxBackMonth = maxMonth - 1;// 最大后移月数(包括当月(结束日期为准))
            // 计算3个月前的首日。包括本月
            var last3month = endDate.AddMonths(-maxBackMonth).AddDays(-(endDate.AddMonths(-maxBackMonth).Day - 1));
            // 不超当年
            if (last3month.Year != endDate.Year)
            {
                last3month = new DateTime(endDate.Year, 1, 1);
            }
            // 如果超标限制到 3月以内
            if (startDate < last3month)
            {
                startDate = last3month;
            }
            // 这里计算月差,即最后分几个月提取
            var diffMonth = (endDate.Month - startDate.Month) + 1;
        }

        /// <summary>
        /// 计算日限制,默认90天,含当前日
        /// </summary>
        /// <param name="self"></param>
        /// <param name="startDate"></param>
        /// <param name="maxDay"></param>
        public static void LimitDayForEndDate(this DateTime self, DateTime startDate, int maxDay = 90)
        {
            if (maxDay <= 1) return;
            DateTime endDate = self;

            int maxBackDay = maxDay - 1;// 最大后移日数(包含当日)
            // 计算N天前的日期
            var lastNDay = endDate.AddDays(-maxBackDay);
            // 不超当年
            if (lastNDay.Year != endDate.Year)
            {
                lastNDay = new DateTime(endDate.Year, 1, 1);
            }
            // 如果超标限制到N天以内
            if (startDate < lastNDay)
            {
                startDate = lastNDay;
            }
        }
        #endregion --时间扩展,时间扩展和结构--

        #region --屏幕日志记录--
        /// <summary>
        /// 屏幕日志记录 带有对象转换
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="o"></param>
        public static void CLog<T>(this T o, string title = "")
        {
            ForegroundColor = ConsoleColor.Yellow;
            WriteLine($"===={title}=={DateTime.Now.FullStr()}====");
            ForegroundColor = ConsoleColor.Green;
            WriteLine(SerializeObject(o));
        }

        /// <summary>
        /// 屏幕日志记录
        /// </summary>
        /// <param name="i"></param>
        public static void CLog(this string i, string title = "")
        {
            ForegroundColor = ConsoleColor.Yellow;
            WriteLine($"===={title}=={DateTime.Now.FullStr()}====");
            ForegroundColor = ConsoleColor.Green;
            WriteLine(i);
        }
        #endregion --屏幕日志记录--
    }
    #endregion --通用扩展方法--

 

© 著作权归作者所有

捍卫机密
粉丝 5
博文 129
码字总数 49283
作品 0
成都
程序员
私信 提问
从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解

本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验。本文继续上一篇随笔...

walb呀
2017/12/04
0
0
扒一扒 C# 8.0 新功能,程序员会买单吗?

根据 .Net 基金会发布的编程语言最新路线图,为了提供代码质量,Microsoft C# 8 将具有可空引用类型。该功能除了为现有的非空引用添加安全引用类型,编译器在遇到可空类型的引用或 Null 值分...

王练
2017/09/07
1K
12
5个 C# 和 Java 之间的不同方法

C#和Java之间最大的区别之一,是如何处理的方法。在这两种语言,方法是功能代码的基石:他们定义变量,并指定对这些变量进行操作,返回值给其他方法使用。尽管Java语言的创建者遵循了许多基...

迷途d书童
2012/06/07
4.9K
17
C# 程序员最常犯的 10 个错误

关于C# C#是达成微软公共语言运行库(CLR)的少数语言中的一种。达成CLR的语言可以受益于其带来的特性,如跨语言集成、异常处理、安全性增强、部件组合的简易模型以及调试和分析服务。作为现...

oschina
2014/04/29
32.4K
42
C#常量和字段以及各种方法的语法总结

目录 一、 常量和字段.... 1 1、 常量.... 1 2、字段.... 1 二、方法.... 2 1、实例构造器和类(引用类型).... 2 2、 实例构造器和结构(值类型).... 2 3、 类型构造器.... 3 4、 操作符重...

张三你好
2018/10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里云POLARDB如何助力轻松筹打造5亿用户信赖的大病筹款平台?

轻松筹首创了“大病救助”模式,帮助了众多病患在第一时间解決了医疗资金等问题,为了从源头解决了医疗资金问题。而在轻松筹这样全球5.5亿用户信赖的大病筹款平台的背后,是日益增长的各种数...

阿里云云栖社区
19分钟前
4
0
Confluence 6 在升级过程中查看合并日志

为了监控升级的过程,你应该查看 application log 日志中的输出。 通常日志经常将会显示多个日志实例,这个实例是定义在日志的 INFO 级别的,通常格式如下: WikiToXhtmlMigrationThread-n -...

honeymoose
19分钟前
2
0
git diff 文件对比

git diff filepath 工作区与暂存区比较 git diff HEAD filepath 工作区与HEAD ( 当前工作分支) 比较 git diff --staged 或 --cached filepath 暂存区与HEAD比较 git diff branchName filepa......

李佳顺
20分钟前
1
0
spring mvc 定制化配置

spring mvc 自定义配置 1.实现某些接口,然后让上面的类加载进去. class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean......

最爱肉肉
22分钟前
2
0
OSG_采样像机的内容如果不显示到窗口上

cameraLight->setRenderTargetImplementation(Camera::FRAME_BUFFER_OBJECT);// 这句使内容不渲染到屏幕上cameraLight->setRenderOrder(Camera::PRE_RENDER); 1.setRenderTargetImplement......

洛克人杰洛
26分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部