热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:LINQTransform/Pivot

篇首语:本文由编程笔记#小编为大家整理,主要介绍了LINQTransform/Pivot相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了LINQ Transform / Pivot相关的知识,希望对你有一定的参考价值。



我正在开发一个项目,我正在使用实体框架在简单的POCO类中保存信息,操作它,然后输出到OpenXML报告。

我有以下示例类:

public class ClassA
{
property string SectionName {get;set;}
property string Status {get;set;}
property int SingleValue {get;set;}
property int CoupleValue {get;set;}
property int FamilyValue {get;set;}
}

这可以填充例如:

SectiOnName= 'Category 1'
Status = 'Opening'
SingleValue = 0
CoupleValue = 0
FamilyValue = 0
SectiOnName= 'Category 1'
Status = 'Current'
SingleValue = 1
CoupleValue = 1
FamilyValue = 1
SectiOnName= 'Category 1'
Status = 'Closing'
SingleValue = 2
CoupleValue = 2
FamilyValue = 2
SectiOnName= 'Category 2'
Status = 'Opening'
SingleValue = 0
CoupleValue = 0
FamilyValue = 0
SectiOnName= 'Category 2'
Status = 'Current'
SingleValue = 1
CoupleValue = 1
FamilyValue = 1
SectiOnName= 'Category 2'
Status = 'Closing'
SingleValue = 2
CoupleValue = 2
FamilyValue = 2

在我的代码中,我有一个ICollection:

ICollection Classes;

有没有办法将此集合转换/转换为使用LINQ输出的准备:

SectionName | ValueLabel | OpeningValue | CurrentValue | ClosingValue
Category 1 | Single | 0 | 1 | 2
Category 1 | Couple | 0 | 1 | 2
Category 1 | Family | 0 | 1 | 2
Category 2 | Single | 0 | 1 | 2
Category 2 | Couple | 0 | 1 | 2
Category 2 | Family | 0 | 1 | 2

答案

你可以想出这样的东西:

var l = new List
{
new Test { SectiOnName= "Cat 1", Status = "Opening", SingleValue = 0, CoupleValue = 0, FamilyValue = 0 },
new Test { SectiOnName= "Cat 1", Status = "Current", SingleValue = 1, CoupleValue = 1, FamilyValue = 1 },
new Test { SectiOnName= "Cat 1", Status = "Closing", SingleValue = 2, CoupleValue = 2, FamilyValue = 2 },
new Test { SectiOnName= "Cat 2", Status = "Opening", SingleValue = 0, CoupleValue = 0, FamilyValue = 0 },
new Test { SectiOnName= "Cat 2", Status = "Current", SingleValue = 1, CoupleValue = 1, FamilyValue = 1 },
new Test { SectiOnName= "Cat 2", Status = "Closing", SingleValue = 2, CoupleValue = 2, FamilyValue = 2 },
};
const string strValue = "Value";
var cats = l.Select(x => x.SectionName).Distinct().ToArray();
var catNo = cats.Length;
var valProps = new Test().GetType().GetProperties().Where(p => p.Name.EndsWith(strValue)).ToArray();
var vals = valProps.Select(p => p.Name.Split(strValue).First()).ToArray();
var valsNo = vals.Length;
var elNo = catNo * valsNo;
var dictOpClCu = l.GroupBy(t => t.Status).ToDictionary(g => g.Key, g => g
.SelectMany(t => valProps.Select(p => (int) p.GetValue(t, null))).ToArray());
var l2 = new List();
var currCat = -1;
var currVal = -1;
for (var i = 0; i {
l2.Add(new Test2
{
Section = cats[i % (elNo / catNo) != 0 ? currCat : ++currCat],
ValueLabel = vals[++currVal % valsNo],
OpeningValue = dictOpClCu["Opening"][i],
ClosingValue = dictOpClCu["Closing"][i],
CurrentValue = dictOpClCu["Current"][i]
});
}

测试类:

public class Test
{
public string SectionName { get; set; }
public string Status { get; set; }
public int SingleValue { get; set; }
public int CoupleValue { get; set; }
public int FamilyValue { get; set; }
}
public class Test2
{
public string Section { get; set; }
public string ValueLabel { get; set; }
public int OpeningValue { get; set; }
public int CurrentValue { get; set; }
public int ClosingValue { get; set; }
public override string ToString() => $"{Section} | {ValueLabel} | {OpeningValue} | {CurrentValue} | {ClosingValue}";
}

另一答案

您可以通过对SectionName进行分组并将组转换为Status上的字典来使用LINQ执行此操作:

var ans = Classes.GroupBy(c => c.SectionName)
.Select(cg => new { Key = cg.Key, Values = cg.ToDictionary(c => c.Status) })
.SelectMany(cg => new[] {
new Output { SectiOnName= cg.Key, ValueLabel = "Single", OpeningValue = cg.Values["Opening"].SingleValue, CurrentValue = cg.Values["Closing"].SingleValue, ClosingValue = cg.Values["Current"].SingleValue },
new Output { SectiOnName= cg.Key, ValueLabel = "Couple", OpeningValue = cg.Values["Opening"].CoupleValue, CurrentValue = cg.Values["Closing"].CoupleValue, ClosingValue = cg.Values["Current"].CoupleValue },
new Output { SectiOnName= cg.Key, ValueLabel = "Family", OpeningValue = cg.Values["Opening"].FamilyValue, CurrentValue = cg.Values["Closing"].FamilyValue, ClosingValue = cg.Values["Current"].FamilyValue }
}).ToList();


推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
author-avatar
我就是我
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有