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) 的逻辑流