ILookup的一个小应用

Posted qintai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ILookup的一个小应用相关的知识,希望对你有一定的参考价值。


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的一个小应用的主要内容,如果未能解决你的问题,请参考以下文章

Android获取各个应用程序的缓存文件代码小片段(使用AIDL)

此应用小部件片段中所有意图 (PendingIntents) 的逻辑流

微信小程序代码片段

小片段中的 ORA-06512 [重复]

Android课程---Android Studio使用小技巧:提取方法代码片段

VS中添加自定义代码片段——偷懒小技巧