C#基礎----Linq之List


  

   最近有用到List處理排序以及分頁的問題.想想還是寫一個博客記錄一下。以下圍繞Person類實現,Person類只有Name和Age兩個屬性

    一.List<T>排序

       1.1 List<T>提供了很多排序方法,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<T>分頁

   2.1在Silverlight往往有時候我們會從后台獲取很多數據,存放在List<T>,可是因為界面受限制無法完全展示,我們就會想到分頁顯示,對於分頁顯示我們基本上第一種想法肯定是通過循環設置每一頁的Size,代碼如下:

        /// <summary>
        /// 獲取單頁數據
        /// </summary>
        /// <param name="lstPerson">數據集合</param>
        /// <param name="pageIndex">頁碼(默認從1開始)</param>
        /// <param name="PageSize">每一頁的數據行數</param>
        /// <returns></returns>
        public static List<Person> GetPage(List<Person> lstPerson, int pageIndex, int PageSize)
        {
            List<Person> pagePerson = new List<Person>();
            for (int index = (pageIndex - 1) * PageSize; index < pageIndex * PageSize && index<lstPerson.Count; index++)
            {
                pagePerson.Add(lstPerson[index]);
            }

            return pagePerson;
        }

          2.2,其實linq有skip和take方法,skip表示跳過多少元素,take獲取特定個數元素. 看起來代碼簡潔多了.

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

      三,List<T>之foreach用法.

     2.1 如何我相對List里面的每個對象執行相同操作的話,以前都是通過for循環遍歷,其實Linq提供了便捷的Foreach來實現。下面我將對所有的Person年齡+2.

    

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

 

 

 

  


免責聲明!

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



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