你的位置:首页 > ASP.net教程

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

回到目录