中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

EF架構~為分組添加位(wei)運算聚(ju)合方法

回到目錄

我們知道在Linq里的分組groupby可以對集合中一個或者多個字段進行分組,并對其中一個屬性進行聚合,而Linq為我們提供了多種聚合方法,由aver,sum,count等,而在大叔權限體系中,以上幾種聚合是不夠的,因為我們需要對權限字段進行按位聚合,或者說(shuo)對它進(jin)行按(an)位(wei)(wei)的或運算,這(zhe)對于學過(guo)計算機(ji)基礎的同學不是什么難(nan)事,按(an)位(wei)(wei)求或,就是將數(shu)值(zhi)先轉為(wei)二進(jin)制,進(jin)行兩個運算數(shu)進(jin)行求或,原則(ze)是:有1則(ze)1,全0才0,這(zhe)是上學時老師教的,呵(he)呵(he)。

對(dui)于Linq的擴展方法微軟開發(fa)人員都(dou)放在(zai)(zai)了System.Linq這個(ge)命(ming)名空(kong)(kong)間(jian)下(xia)面,所以(yi)咱(zan)們自(zi)己寫擴展時,也最好遵循這個(ge)原則,都(dou)寫在(zai)(zai)這個(ge)命(ming)名空(kong)(kong)間(jian)下(xia),這樣在(zai)(zai)使用(yong)時也很方便,因為VS建立項目后,在(zai)(zai)config里會自(zi)己引用(yong)這個(ge)命(ming)名空(kong)(kong)間(jian),在(zai)(zai)開發(fa)效(xiao)率上(shang)是很高(gao)(gao)高(gao)(gao)的。

微軟為我們封裝的一些集合的擴展方法

namespace System.Linq
{
    // 摘要:
    //     提(ti)供一(yi)組用于查詢實(shi)現 System.Collections.Generic.IEnumerable<T> 的(de)對象的(de) static(在(zai) Visual
    //     Basic 中(zhong)為 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>
        /// 按或進行位運算
        /// 作者:倉儲大(da)叔(shu)
        /// </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;
        }

在實現(xian)中使用時,與sum方(fang)法是一樣(yang)的,只不(bu)過sum是對(dui)(dui)數值(zhi)進行求(qiu)和,而BinaryOr是對(dui)(dui)數值(zhi)按位(wei)求(qiu)或,這兩者在運算結(jie)果上是完全(quan)不(bu)同的,如下所(suo)示

都是1,2,4,4,2,1進行求聚合(he)

Sum()的結果:14

BinaryOr()的結果:7

對于按位運算的實際(ji)意義(yi):它(ta)在(zai)Flags標識的枚舉上經常使用(枚舉元素值為2的N次冪),像在(zai)大叔框(kuang)架(jia)里的權(quan)限(xian)部分,也是使用了這種枚舉進行存儲的。

回到目錄

posted @ 2016-08-06 08:53  張占嶺  閱讀(2047)  評論(0)    收藏  舉報