zoukankan      html  css  js  c++  java
  • EF架构~为分组添加位运算聚合方法

    回到目录

    我们知道在Linq里的分组groupby可以对集合中一个或者多个字段进行分组,并对其中一个属性进行聚合,而Linq为我们提供了多种聚合方法,由aver,sum,count等,而在大叔权限体系中,以上几种聚合是不够的,因为我们需要对权限字段进行按位聚合,或者说对它进行按位的或运算,这对于学过计算机基础的同学不是什么难事,按位求或,就是将数值先转为二进制,进行两个运算数进行求或,原则是:有1则1,全0才0,这是上学时老师教的,呵呵。

    对于Linq的扩展方法微软开发人员都放在了System.Linq这个命名空间下面,所以咱们自己写扩展时,也最好遵循这个原则,都写在这个命名空间下,这样在使用时也很方便,因为VS建立项目后,在config里会自己引用这个命名空间,在开发效率上是很高高的。

    微软为我们封装的一些集合的扩展方法

    namespace System.Linq
    {
        // 摘要:
        //     提供一组用于查询实现 System.Collections.Generic.IEnumerable<T> 的对象的 static(在 Visual
        //     Basic 中为 Shared)方法。
        public static class Enumerable
        {
           
            public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func);
            
            public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func);
            
            public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector);
           
            public static bool Any<TSource>(this IEnumerable<TSource> source);
            
            public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

    大叔照着葫芦去画飘

         /// <summary>
            /// 按或进行位运算
            /// 作者:仓储大叔
            /// </summary>
            /// <typeparam name="TSource"></typeparam>
            /// <param name="source"></param>
            /// <param name="selector"></param>
            /// <returns></returns>
            public static int BinaryOr<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
            {
                int result = 0;
                foreach (var item in source)
                {
                    result |= selector(item);
                }
                return result;
            }

    在实现中使用时,与sum方法是一样的,只不过sum是对数值进行求和,而BinaryOr是对数值按位求或,这两者在运算结果上是完全不同的,如下所示

    都是1,2,4,4,2,1进行求聚合

    Sum()的结果:14

    BinaryOr()的结果:7

    对于按位运算的实际意义:它在Flags标识的枚举上经常使用(枚举元素值为2的N次幂),像在大叔框架里的权限部分,也是使用了这种枚举进行存储的。

    回到目录

  • 相关阅读:
    New version of VS2005 extensions for SharePoint 3.0
    QuickPart : 用户控件包装器 for SharePoint Server 2007
    随想
    发布 SharePoint Server 2007 Starter Page
    如何在SharePoint Server中整合其他应用系统?
    Office SharePoint Server 2007 中文180天评估版到货!
    RMS 1.0 SP2
    SharePoint Server 2007 Web内容管理中的几个关键概念
    如何为已存在的SharePoint站点启用SSL
    Some update information about Office 2007
  • 原文地址:https://www.cnblogs.com/lori/p/5743277.html
Copyright © 2011-2022 走看看