zoukankan      html  css  js  c++  java
  • 如何将某个元素放到集合第一个

    一、情节交待

      现在有一个用户的信息列表,列表中所包含的信息有普通信息、置顶信息、还有标注成"特别关注"的信息,"特别关注"的信息不仅在信息表中存在,还在推荐信息表中存在(说明:"特别关注"不是拿字段做标识,而是关联表记录来区分,因为涉及到有效时间之类的。)。我现在需要把"特别关注"的信息放在信息列表的最前面,但是列表中的信息都是按信息的刷新时间降序排列的,默认是把所有信息都读取出来的,当然也包括"特别关注"的信息。

      我一开始想的就是更改列表的排序规则,先读取"特别关注"的,再读取其他的信息,但是想了一下发现这样做比较麻烦,第一,读取非"特别关注"的信息的时候得筛选掉"特别关注"的信息,第二,这种情况分页实现起来比较麻烦,因为每一页的起始位置都跟"特别关注"信息的条数相关。所以,我考虑换种方式,从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的位置即第一个.
      }
    }

    小结:这种处理方式不适合处理大量数据,效率太低.

  • 相关阅读:
    poj3417 闇の連鎖 【树上差分】By cellur925
    Luogu P1613跑路【倍增】By cellur925
    CF519E A and B and Lecture Rooms
    poj 2412 The Balance 【exgcd】By cellur925
    NOIp 2014 解方程 【数学/秦九韶算法/大数取膜】By cellur925
    Maven项目整合SSH框架
    传递依赖
    Maven项目整合Struts2框架
    K.O. -------- Eclipse中Maven的报错处理
    依赖范围
  • 原文地址:https://www.cnblogs.com/52XF/p/4143181.html
Copyright © 2011-2022 走看看