如何將某個元素放到集合第一個


一、情節交待

  現在有一個用戶的信息列表,列表中所包含的信息有普通信息、置頂信息、還有標注成"特別關注"的信息,"特別關注"的信息不僅在信息表中存在,還在推薦信息表中存在(說明:"特別關注"不是拿字段做標識,而是關聯表記錄來區分,因為涉及到有效時間之類的。)。我現在需要把"特別關注"的信息放在信息列表的最前面,但是列表中的信息都是按信息的刷新時間降序排列的,默認是把所有信息都讀取出來的,當然也包括"特別關注"的信息。

  我一開始想的就是更改列表的排序規則,先讀取"特別關注"的,再讀取其他的信息,但是想了一下發現這樣做比較麻煩,第一,讀取非"特別關注"的信息的時候得篩選掉"特別關注"的信息,第二,這種情況分頁實現起來比較麻煩,因為每一頁的起始位置都跟"特別關注"信息的條數相關。所以,我考慮換種方式,從List集合本身下手,找了找沒找到類似直接移動元素的方法,而且OrderBy()和OrderByDescending()方法不支持按某個屬性進行排序(可能是小弟我技術太差,大牛敬請拍磚),考慮到這次的需求,"特別關注"的信息不會太多,也就幾條,我就想了一個簡單的辦法,先刪后加法。

二、先刪后加法

  看標題就知道不是什么高深的算法,實現原理就是,獲取用戶"特別關注"信息的Id集合recommList,循環這個List集合,從用戶當前頁的信息集合(pageList)中找到"特別關注"的信息,然后用一個臨時對象temp接收,從pageList刪除這個元素,最后把臨時對象temp插入到pageList中的第一個位置。需要注意一點的時,因為信息都是按刷新時間降序排列,所以在獲取用戶"特別關注"信息的Id集合recommList的時候要按刷新時間升序排列,因為只有按升序排列,執行完先刪后加法之后,"特別關注"中最新的信息才會排列在第一個。

參考代碼:

var pageList = GetPageListByUserId(page,pageSize,userId);//分頁獲取用戶發布的信息集合.
//處理關注信息,若關注信息太多則這種處理方式不適合.
var recommList = GetListByUserId(userId);//獲取用戶的關注信息Id集合,默認是升序,所以經過處理之后最后設置為特別關注的在最前面.
if (recommList != null && recommList.Count>0)
{
  //關注信息放在首位,最后標注為"特別關注"的信息應在最前面.
  foreach (var id in recommList)
  {
    var temp = pageList.Find(m => m.InfoId == id);//默認是升序,所以經過處理之后最后標注為"特別關注"的信息在最前面.
    if (temp == null)
    {
      continue;
    }
    pageList.Remove(temp);//先刪:直接移除元素.
    temp.IsRecommInfo = true;//這里可以做一些處理,比如設置InfoModel的IsRecommInfo(是否是關注信息)為true.
    pageList.Insert(0, temp);//后加:插入到索引為0的位置即第一個.
  }
}

 

小結:這種處理方式不適合處理大量數據,效率太低.


免責聲明!

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



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