不使用遍历循环、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,我在此仅作为抛砖,期待大家引玉!!

 

posted @ 2012-12-18 18:32  dong.net  阅读(7358)  评论(10编辑  收藏  举报