码迷,mamicode.com
首页 > 其他好文 > 详细

ILookup的一个小应用

时间:2019-11-09 23:31:37      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:val   export   foreach   升级版   索引   数据   ade   summary   add   


ILookup是数据结构的一种,Lookup继承于它,终极父类也是 IEnumerable,能使用Linq的所有方法,
Ilookup是字典的升级版本,最适合最 一对多的使用场景,可以使用索引,
下面是一个应用场景,省对应多个地级市 关系

技术图片

 

{
  (var itearea, _) = es.GetTCInfo(itemid, type, stime, etime);
   if (itearea.Count() > 0)
   {
       Type _type = itearea.ToList()[0].GetType();
       var plist = itearea.Select(k => (string)_type.GetProperty("name").GetValue(k)); //所有省的名称 最多 34个省级行政区域,最多遍历34次
       var datasoure = plist.ToLookup(p => p, pname => es.TpcitySubdivision(pname, itemid, type, stime,etime).ToList());
       AsposeCellUtil.ComposeExcel($"{(type == 1 ? "话题" : "频道")}地域详情{DateTime.Now.ToString("yyyyMMddHHmmss")}.xls", datasoure, new string[] { "城市名称", "人数" });
   }
    else
      System.Web.HttpContext.Current.Response.Write("没有内容可供导出!");
}

 

       /// <summary>
        /// 组合导出 【传入的表头数量必须与数据源对象的字段一致】,不支持基本类型
        /// </summary>
        /// <param name="datasou">数据源</param>
        /// <param name="header">表头</param>
        public static void ComposeExcel<Source>(string filename, ILookup<string, List<Source>> datasou, params string[] header) where Source : class
        {
            ExectExportStream(filename, () =>
            {
                Workbook book = new Workbook(); 
                book.Worksheets.Clear();
                if (datasou.Count==0)
                    return null;
                
                foreach (var item in datasou)
                {
                    Worksheet worksheet = book.Worksheets.Add(item.Key);
                    Assemblesheet(ref worksheet, datasou[item.Key], header);
                }
                return book.SaveToStream();
            });
        }

        private static void Assemblesheet<Source>(ref Worksheet worksheet, IEnumerable<List<Source>> enumerable, params string[] header) 
        {
            if (enumerable.Count()==0)
                return;
            
            var list = enumerable.ToList()[0];  // 1 对 多 关系
            if (list.Count==0)
                return;

            Cells cells = worksheet.Cells;
            var pageCount = list.Count / importPageCount + (list.Count % importPageCount > 0 ? 1 : 0);
            PropertyInfo[] ps = list[0].GetType().GetProperties();
            bool isstr = list[0].GetType().IsValueType; //是否是值类型
            for (int j = 0; j < header.Length; j++)
                cells[0, j].PutValue(header[j]); //添加表头

            for (int i = 0; i < list.Count; i++)
            {
                for (int k = 0; k < header.Length; k++)
                {
               //    if (isstr)
               //        cells[1 + i, k].PutValue(list[i]); //插入数据
               //    else
                       cells[1 + i, k].PutValue(ps[k].GetValue(list[i])); //插入数据
                    // 表头 与 字段数量完全一致 k=表头个数,ps的属性
                }
            }
        }

技术图片

 

 

ILookup的一个小应用

标签:val   export   foreach   升级版   索引   数据   ade   summary   add   

原文地址:https://www.cnblogs.com/Qintai/p/11828261.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!