C#基础----Linq之List篇

最近有用到List处理排序以及分页的问题.想想还是记录一下。以下围绕Person类实现,Person类只有Name和Age两个属性

    一.List排序

       1.1 List提供了很多排序方法,sort(),Orderby(),OrderByDescending().

    

lstPerson = lstPerson.OrderByDescending(x=>x.Name).ToList(); //降序
lstPerson = lstPerson.OrderBy(x => x.Age).ToList();//升序

//通过Name和Age升序
lstPerson.Sort((x, y) =>
            {
                if ((x.Name.CompareTo(y.Name) > 0) || ((x.Name == y.Name) && x.Age > y.Age))
                {
                    return 1;
                }
                else if ((x.Name == y.Name) && (x.Age == y.Age))
                {
                    return 0;
                }
                else
                {
                    return -1;
                }
            });

        1.2 因为最近有做Silverlight的datagrid里面像实现点击任何一列的名称就按照该名称排序,那我们该怎么做呢?可能第一反应是想,为每一个属性写一个排序方法不就得了,其实这样的话无意间增加的代码量了,而且不通用,其实这里可以结合反射来实现.
    

 string propertityName = "Name";
 lstPerson = lstPerson.OrderBy(x =>
            {
                PropertyInfo[] proInfos = x.GetType().GetProperties();
                return proInfos.Where(info => info.Name == propertityName).ToList()[0].GetValue(x);
            }).ToList();

   二.List分页

   2.1在Silverlight往往有时候我们会从后台获取很多数据,存放在List,可是因为界面受限制无法完全展示,我们就会想到分页显示,对于分页显示我们基本上第一种想法肯定是通过循环设置每一页的Size,代码如下:

        /// 
        /// 获取单页数据
        /// 
        /// 数据集合
        /// 页码(默认从1开始)
        /// 每一页的数据行数
        /// 
        public static List GetPage(List lstPerson, int pageIndex, int PageSize)
        {
            List pagePerson = new List();
            for (int index = (pageIndex - 1) * PageSize; index < pageIndex * PageSize && index)
            {
                pagePerson.Add(lstPerson[index]);
            }

            return pagePerson;
        }

          2.2,其实linq有skip和take方法,skip表示跳过多少元素,take获取特定个数元素. 看起来代码简洁多了.

public static List GetPageByLinq(List lstPerson, int pageIndex, int PageSize)
{
    return lstPerson.Skip((pageIndex - 1) * PageSize).Take(PageSize).ToList();
}

      三,List之foreach用法.

     2.1 如何我相对List里面的每个对象执行相同操作的话,以前都是通过for循环遍历,其实Linq提供了便捷的Foreach来实现。下面我将对所有的Person年龄+2.

    

lstPerson.ForEach(x => x.Age= x.Age + 2);

你可能感兴趣的:(C#学习记录)