EF架構~爲分組添加位運算聚合方法

回到目錄html

咱們知道在Linq裏的分組groupby能夠對集合中一個或者多個字段進行分組,並對其中一個屬性進行聚合,而Linq爲咱們提供了多種聚合方法,由aver,sum,count等,而在大叔權限體系中,以上幾種聚合是不夠的,由於咱們須要對權限字段進行按位聚合,或者說對它進行按位的或運算,這對於學過計算機基礎的同窗不是什麼難事,按位求或,就是將數值先轉爲二進制,進行兩個運算數進行求或,原則是:有1則1,全0才0,這是上學時老師教的,呵呵。框架

對於Linq的擴展方法微軟開發人員都放在了System.Linq這個命名空間下面,因此我們本身寫擴展時,也最好遵循這個原則,都寫在這個命名空間下,這樣在使用時也很方便,由於VS創建項目後,在config裏會本身引用這個命名空間,在開發效率上是很高高的。this

微軟爲咱們封裝的一些集合的擴展方法spa

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);

大叔照着葫蘆去畫飄code

     /// <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是對數值按位求或,這二者在運算結果上是徹底不一樣的,以下所示htm

都是1,2,4,4,2,1進行求聚合對象

Sum()的結果:14blog

BinaryOr()的結果:7開發

對於按位運算的實際意義:它在Flags標識的枚舉上常用(枚舉元素值爲2的N次冪),像在大叔框架裏的權限部分,也是使用了這種枚舉進行存儲的。get

回到目錄

相關文章
相關標籤/搜索