如何解决Linq映射列表成
无法弄清楚,但是必须有更好的方法来实现它:
List<Ticket> results = new List<Ticket>();
var grouped = lines.GroupBy(x => x.TicketNumber);
foreach (var item in grouped)
{
Ticket ticket = new Ticket();
ticket.TicketLines = item.Select(g => new TicketLine()
{
TicketNumber = g.TicketNumber,TicketItem = g.TicketItem,Qty = g.Qty,ProductNumber = g.ProductNumber
}).ToList();
results.Add(ticket);
};
门票是具有单个属性的类-> public List<TicketLine> TicketLines { get; set; }
换句话说,我想要以下设置: 机票,机票项目,数量,产品
1,1,5,12345
1,2,32323
2,3,22222
2,8,33333
映射到两张票证的列表中,每张票证包含两个项目。
该代码段可以完成这项工作,但是我敢肯定,有一种更好的方法可以实现它。
解决方法
var results = lines
.GroupBy(x => x.TicketNumber)
.Select(g => new Ticket {
TicketNumber = g.Key,TicketLines = g.ToList()
}).ToList();
,
因此,您有一个Lines
序列,其中每个Line
至少具有属性TicketNumber
,TicketItem
和ProductNumber
您要创建具有相同票证编号的行组。对于每个组,您只想制作一个类Ticket
的对象。此故障单包含TickeLines
的列表,组中每行的一条故障单。
因此,工单中的每个工单行都对应一个行。它包含以下属性值
- TicketNumber:组中所有行的公用TicketNumber
- TicketItem:相应行的TicketItem属性的值
- 数量是组中的行数,
- ProductNumber:相应行的属性ProductNumber的值。
在对您的要求进行了相当大的介绍之后,代码很简单。我使用Enumerable.GroupBy that has a parameter resultSelector
的重载var tickets = lines.GroupBy(line => line.TicketNumber,// parameter resultSelector: use the common ticketNumber and all Lines that have this
// ticketNumber to make exactly one Ticket object
(ticketNumber,linesWithThisTicketNumber) => new Ticket
{
// for every Line in this group,make one TicketLine:
TicketLines = linesWithThisTicketNumber.Select(line => new TickeLine
{
TicketNumber = ticketNumber,TicketItem = line.TicketItem,Qty = linesWithThisTicketNumber.Count(),ProductNumber = line.ProductNumber,})
.ToList(),});
改进空间
以上不是很有效。工单中每个工单行的工单号和数量将具有相同的值。您确定要这个吗?以下内容似乎更合乎逻辑:
// parameter resultSelector: use the common ticketNumber and all Lines that have this
// ticketNumber to make exactly one object
(ticketNumber,linesWithThisTicketNumber) => new
{
TicketNumber = ticketNumber,// for every Line in this group,make one TicketLine:
TicketLines = linesWithThisTicketNumber.Select(line => new
{
TicketItem = line.TicketItem,});
结果是一个对象序列,其中每个对象都有一个TicketNumber和一个对象列表,这些对象的数据是从具有该TicketNumber的行中提取的。列表中的元素数为“数量”。
除了数量仅计算一次的优点外,您将不会存储重复的值。
想象一下,如果有人决定添加TicketLine,将会发生什么事情
var tickets = ... // see original answer
tickets[0].TickedLines.Add(new TicketLine());
在这种情况下,“数量”的值是否仍然正确?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。