不使用遍歷循環、Linq與Lamba表達式快速對List集合進行篩選與排序——在集合類里使用Find、FindAll與Sort


最近進行的開發中都是基於.NET 2.0,.NET 2.0雖然很經典,但是用慣了LINQ與Lambda,現在才知道LINQ與Lambda是多么的強大,多么的大快人心,特別對於集合類。
我原以為在2.0時代,對於集合類我們只能去寫循環對其篩選或排序等等,真是見識太短淺了。
OK,廢話少扯,進入正題。第一個分享的代碼是Find方法,其參數為一個委托,微軟已經為我們定義好這個委托,直接使用即可。(如果對委托不了解,可以谷歌下,或者參照不才之作 http://www.cnblogs.com/FreeDong/archive/2012/09/27/2705372.html 做C#開發如果懂得使用委托和事件將會讓咱們的編碼世界更加豐富與有趣),好了貼上我寫的一個方法的代碼:

        /// <summary>
        /// 方法說明:是否包含該菜單名
        /// 作    者:梁文東
        /// 創建時間:2012-12-14
        /// </summary>
        /// <param name="key">The key.</param>
        /// <returns>返回是否包含該菜單名</returns>
        public bool CantainKey(string key)
        {
            return this.MenuEdits.Find(new Predicate<MenuEditEntity>(delegate(MenuEditEntity entity)
            {
                return entity.MenuKey == key;
            })) != null;
        }    

該方法中this.MenuEdits為類的成員,類型為 List<MenuEditEntity>,我在這里邊直接使用了匿名委托,以下亦是,該委托返回的是bool類型,即為我們要篩選的條件。

接下來到FindAll方法,但是,我就不貼代碼了,用法與Find類似,只不過它返回的是符合條件的集合對象,而不是只返回第一個。

然后到Sort方法,這個有點麻煩,先看代碼。

            list.Sort(new Comparison<BaseEditor>(delegate(BaseEditor model1, BaseEditor model2) 
                {
                    if (model1.TabIndex == model2.TabIndex)
                    {
                        return 0;
                    }
                    else if (model1.TabIndex < model2.TabIndex)
                    {
                        return -1;
                    }
                    else
                    {
                        return 1;
                    }
                }));        

同樣的list的類型為List<BaseEditor>,而BaseEditor為自定義控件(控件肯定要包含TabIndex屬性啦,呵呵),我在這里面獲取一個窗體里面所有的控件,然后想讓這些控件按照TabIndex進行排序,這個做窗體開發用到的也不少啊。然后有一點不同的是Sort方法沒有返回值,直接對list進行排序了。

最后這個委托有點難理解,這里邊返回值只有-1、0、1,其他返回值對排序無影響,返回0與-1則兩個對比的對象不調順序,若返回1則需調,如上,

model1.TabIndex > model2.TabIndex 則表明model1應該排在model2之后,依次類推。

當然上述還有其他用途更廣的重載,大家具體可參見MSDN,我在此僅作為拋磚,期待大家引玉!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM