【Basic Code】对List进行筛选的几种方法

来源:互联网 发布:在淘宝网上怎么买东西 编辑:程序博客网 时间:2024/06/05 02:33

前提:

       在项目中MVVM模式在前台View是直接和ViewModel当中的对象进行绑定,所以后台逻辑更多的将需要的数据以List的形式传递给ViewModel,期间大量的对List的筛选操作,做如下总结。


 一、单值作为筛选条件,筛选集合:

       1.where限定

var item = Mysql.From<D.Talbe>().Where(a => a.property == 值).ToFirst()/ToList(). 

      2.Find限定

int realid = realaccount.Find(a => a.Status == 0).Id;
          FindAll, FindIndex, FindLast……

      3.Exist限定

//详情去实例化一个集合,按F12熟练其属性用法,了解其区别


二、集合作为筛选条件,筛选集合:

      1.循环方法:

if (!string.IsNullOrEmpty(PayREQ.CardNum)){  List<D.LeaguerEvent> cancelInfo = new List<D.LeaguerEvent>();  var card = GetCardInfo(PayREQ.CardNum);  if (card == null)    return cancelCardNull;  var leaginfos = MySql.From<D.LeaguerCard>().Where(a => a.CardId == card.Id).ToList();   //以leaginfos集合作为筛选条件  foreach (var l in leaginfos)   {     //list中通过LeaguerId进行匹配     cancelInfo.AddRange(list.Where(b => b.LeaguerId == l.Id).ToList());   }  list.Clear();  list = cancelInfo;}  
        理解:

      (1)在进行if判断之前已经有一个list结果集,如果传入pay.REQ不为null或者空,以查询出的leaginfos做筛选条件。

      (2)foreach循环中,通过对list筛选后,结果传入一个新的cancelInfo当中,foreach外面清空list,将cancelInfo赋值给list,最后统一返回。

       

      2.Contains反包含

var leaguerId = from fn in leag              select fn.Id;List<int> id = leaguerId.ToList(); //直接以list作为条件,进行筛选var consumelistSelect = consumelist.Where(p => id.Contains(p.ChildCardId)).ToList();   consumelist.Clear();   consumelist = consumelistSelect;  
        理解:

     (1)先拿到作为筛选条件的List集合,并转换类型为将要被筛选的List里对应字段的数据类型。

     (2)关键代码处:(p => id.Contains(p.ChildCardId)).ToList(); 切记,这种反包含的写法,是筛选条件写到外面,被筛选的集合放到括号里,这种写法也是和郑浩请教的远洋地产公司的写法,很便捷。

      

      对比:

     (1)前者适用于数据量小的地方,通过foreach循环,出异常的几率更小,因为在项目中使用反包含写法报了几次Bug,但是前者没有,(也有可能是上下界的问题)。

     (2)速度上后者更优,数据量上万条,择优选择后者。


       

0 0
原创粉丝点击