匹配两个列表成员的最快方法

时间:2019-11-20 06:54:01

标签: c#

我有两个列表,分别是orderHeadersorderLines。这是数据库中的两个相关表,但是当我拉它们时,我必须将它们分别拉成两个不同的列表,然后稍后将它们相互映射。我现在有一个解决方案,但是考虑到我有大约40万个标题和100万以上的行,因此性能有些令人失望。

这是我下面的代码。这是遍历并在两个列表中查找成员的标准方法,还是C#中有更优化的方法?

var OutboundOrderHeaders = 
     DbContext.Context.Database.SqlQuery<OutboundOrderDTO>(queryString, parameter);
var OutboundOrderHeadersList = OutboundOrderHeaders.ToList();
var OutboundOrderLine = 
     DbContext.Context.Database.SqlQuery<OutboundOrderLineDTO>(queryStringLine, parameter2);
var OutboundOrderLineList = OutboundOrderLine.ToList();

for(var i = 0; i < OutboundOrderHeadersList.Count(); i++)
{
    var LineToAdd = OutboundOrderLineList
         .Where(x => x.OutboundNumber == OutboundOrderHeadersList[i].OutboundNumber)
         .ToList() ;

    OutboundOrderHeadersList[i].OrderLine = LineToAdd;
}

return OutboundOrderHeadersList;

1 个答案:

答案 0 :(得分:2)

正如评论中指出的那样,我真的很努力在数据库中而不是在内存中做到这一点。但是要在内存中执行此操作,ToLookup可能是正确的方法:

// Note: here I've renamed used outboundOrderLines where you've got OutboundOrderLineList,
// and orderHeaders where you've got OutboundOrderHeadersList, as simpler
// and more conventional variable names.

var linesByOutboundNumber = outboundOrderLines.ToLookup(line => line.OutboundNumber);
foreach (var orderHeader in orderHeaders)
{
    orderHeader.OrderLine = linesByOutboundNumer[orderHeader.OutboundNumber].ToList();
}

这将通过outboundOrderLines 一次(而不是针对每个订单标头对其进行迭代)来构建从出站号码到“具有该出站号码的所有行”的地图。