zoukankan      html  css  js  c++  java
  • 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的属性
                    }
                }
            }

  • 相关阅读:
    ZOJ 3278 8G Island 二分+二分
    POJ 2785 4 Values whose Sum is 0 二分
    POJ 3063 Sherlock Holmes 随机化
    UVA 10881 Piortr‘s Ants 思维 模拟
    UVA 1388 Graveyard
    Codeforces Round #410 (Div. 2) B. Mike and strings
    Codeforces 821B
    51nod 1103 N的倍数 抽屉原理
    Codeforces Round #427 (Div. 2) 835D
    Codeforces Round #427 (Div. 2) 835C-Star sky 二维前缀和
  • 原文地址:https://www.cnblogs.com/Qintai/p/11828261.html
Copyright © 2011-2022 走看看