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次幂),像在大叔框架里的权限部分,也是使用了这种枚举进行存储的。

回到目录

时间: 2025-02-01 20:00:28

EF架构~为分组添加位运算聚合方法的相关文章

EF架构为实体模型添加注释

近期做项目,用的是EF的架构,发现自动生成的实体没有注释,所以总结如下方法 1.在edmx中添加注释 1.1类注释 选中实体,打开属性,找到"文档"选项,在"摘要"位置添加类注释,如下图: 1.2属性注释 同类注释,打开属性,找到"文档"选项,在"摘要"位置添加属性注释,如下图: 2.修改tt模版 打开Model.tt文件 2.1添加类注释 找到图中的位置,对t4模板做如下修改 代码复制: string summary=str

【转】Cocoa中的位与位运算

转自:http://www.tuicool.com/articles/niEVjy 介绍 位操作是程序设计中对位模式或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算).(摘自wikipedia) OC作为c的扩展和超集,位运算自然使用的是c的操作符.c提供了6个位操作符,$,|,^,~,<<,>>.本文不打算做位运算的基础教学,只介绍一

POJ 1166 The Clocks 位运算与BFS

1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的状态所需要的最小操作数的操作方案: 2.输入输出:输入给出阵列初始状态,0,1,2,3分别表示0,3,6,9:要求输出最快方案的操作序列: 3.分析:IOI 1994的考题,BFS是比较容易想到的方法之一,关键是如何简洁的表示和改变BFS过程中的阵列状态:这里使用位运算的方法:具体如下: 首先一共9

leetcode_231题——Power of Two (位运算)

Power of Two Total Accepted: 11027 Total Submissions: 36750My Submissions Question Solution Given an integer, write a function to determine if it is a power of two. Credits:Special thanks to @jianchao.li.fighter for adding this problem and creating a

Java中的二进制及基本的位运算

Java中的二进制及基本的位运算 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲学大师莱布尼兹发现.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.计算机中的二进制则是一个非常微小的开关,用"开"来表示1,"关"来表示0. 那么Java中的二进制又是怎么样的呢?让我们一起来揭开它神

第15章 位运算

Description 已知键盘输入的单字节的数据中,存有两项信息:第2位存有性别(0代表male,1代表female),第3.4.5位存有班级(000代表1班,001代表2班,010代表3班,...,111代表8班).请编程,从输入的数据中提取这两项信息并输出.说明:每个字节的最右边是第0位 Input 输入一个单字节的数据 Output 输出两项信息 Sample Input 12 Sample Output 2,female #include <stdio.h>#include <

EF架构~为EF DbContext生成的实体添加注释(T5模板应用)

相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回  EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回EF架构~为EF DbContext生成的实体添加注释(T5模板应用) 嗨,没法说,EF4的TT模版加上注释后,升级到EF5的TT模版后,注释就不通用了,所以,还得再研究一下,然后把操作方法再分享出来,没辙的微软! T4模版可能有些凌乱,这在T5模版里有了不错的改进,但我希望解决的问题在T5里并没有得到解决,那就是TT类文件自动得到E

[翻译]位运算暗黑魔导书

原文地址:http://graphics.stanford.edu/~seander/bithacks.html 有本书叫hack's delight也是主讲位运算的. 下面正文开始翻译吧,不定时更新. 声明: 如无特殊说明,所有的代码段都是不受版权限制的,如果喜欢,大家可以随便使用.文章内容由Sean Eron Anderson收集整理于1997-2005年.位运算的相关代码.说明以及分类希望能够给大家带来帮助,但是不对于该内容是否适合特定用途提供任何担保(or授权?).截止2005年5月5日

位运算总结&amp;拾遗

JavaScript 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个数为2的幂,那么该数的二进制码只有最高位是1. 根据这个性质,我们来举个栗子,比如有数字10,转为二进制码后为: 1 0 1 0 我们只需把 0 bit的位置全部用1填充,然后再把该二进制码加1就ok了.而x | (x + 1)正好可以把最右边的0置为1,可是