一、情节交待
现在有一个用户的信息列表,列表中所包含的信息有普通信息、置顶信息、还有标注成"特别关注"的信息,"特别关注"的信息不仅在信息表中存在,还在推荐信息表中存在(说明:"特别关注"不是拿字段做标识,而是关联表记录来区分,因为涉及到有效时间之类的。)。我现在需要把"特别关注"的信息放在信息列表的最前面,但是列表中的信息都是按信息的刷新时间降序排列的,默认是把所有信息都读取出来的,当然也包括"特别关注"的信息。
我一开始想的就是更改列表的排序规则,先读取"特别关注"的,再读取其他的信息,但是想了一下发现这样做比较麻烦,第一,读取非"特别关注"的信息的时候得筛选掉"特别关注"的信息,第二,这种情况分页实现起来比较麻烦,因为每一页的起始位置都跟"特别关注"信息的条数相关。所以,我考虑换种方式,从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的位置即第一个. } }
小结:这种处理方式不适合处理大量数据,效率太低.