一、情節交待
現在有一個用戶的信息列表,列表中所包含的信息有普通信息、置頂信息、還有標注成"特別關注"的信息,"特別關注"的信息不僅在信息表中存在,還在推薦信息表中存在(說明:"特別關注"不是拿字段做標識,而是關聯表記錄來區分,因為涉及到有效時間之類的。)。我現在需要把"特別關注"的信息放在信息列表的最前面,但是列表中的信息都是按信息的刷新時間降序排列的,默認是把所有信息都讀取出來的,當然也包括"特別關注"的信息。
我一開始想的就是更改列表的排序規則,先讀取"特別關注"的,再讀取其他的信息,但是想了一下發現這樣做比較麻煩,第一,讀取非"特別關注"的信息的時候得篩選掉"特別關注"的信息,第二,這種情況分頁實現起來比較麻煩,因為每一頁的起始位置都跟"特別關注"信息的條數相關。所以,我考慮換種方式,從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的位置即第一個. } }
小結:這種處理方式不適合處理大量數據,效率太低.