C# 比较两个大型通用列表

C# 比较两个大型通用列表,c#,.net-4.0,C#,.net 4.0,我找不到一个具体的例子,所以我把这个问题贴出来。谢谢你的帮助 我有两个大型通用列表,都有超过30万项 我在第一个列表中循环,以提取信息并动态生成新列表的新项,但我需要在第二个列表中搜索,并根据三个匹配条件返回一个值,如果发现要添加到列表中,但是正如您所想象的,执行这300k*300k次需要时间 有什么方法可以让我更有效地完成这项工作吗 我的代码: var reportList = new List<StocksHeldInCustody>(); foreach (var correc

我找不到一个具体的例子,所以我把这个问题贴出来。谢谢你的帮助

我有两个大型通用列表,都有超过30万项

我在第一个列表中循环,以提取信息并动态生成新列表的新项,但我需要在第二个列表中搜索,并根据三个匹配条件返回一个值,如果发现要添加到列表中,但是正如您所想象的,执行这300k*300k次需要时间

有什么方法可以让我更有效地完成这项工作吗

我的代码:

var reportList = new List<StocksHeldInCustody>();
foreach (var correctDepotHolding in correctDepotHoldings)
  {
    var reportLine = new StocksHeldInCustody();
    reportLine.ClientNo = correctDepotHolding.ClientNo;
    reportLine.Value = correctDepotHolding.ValueOfStock;
    reportLine.Depot = correctDepotHolding.Depot;
    reportLine.SEDOL = correctDepotHolding.StockCode;
    reportLine.Units = correctDepotHolding.QuantityHeld;
    reportLine.Custodian = "Unknown";
    reportLine.StockName = correctDepotHolding.StockR1.Trim() + " " + correctDepotHolding.StockR2.Trim();

    //Get custodian info

    foreach (var ccHolding in ccHoldList)
    {
      if (correctDepotHolding.ClientNo != ccHolding.ClientNo) continue;
      if (correctDepotHolding.Depot != ccHolding.Depot) continue;
      if (correctDepotHolding.StockCode != ccHolding.StockCode) continue;
      if (correctDepotHolding.QuantityHeld != ccHolding.QuantityHeld) continue;
      reportLine.Custodian = ccHolding.Custodian;
      break;
    }
    reportList.Add(reportLine);
  }
var reportList=newlist();
foreach(修正中的var CorrectedDepotholding)
{
var reportLine=新的StockSheldInConservision();
reportLine.ClientNo=correctedDepotholding.ClientNo;
reportLine.Value=correctedDepotholding.ValueOfStock;
reportLine.Depot=正确的Depotholding.Depot;
reportLine.SEDOL=correctedDepotholding.StockCode;
reportLine.Units=correctedepholding.quantityhold;
reportLine.storage=“未知”;
reportLine.StockName=correctDepotHolding.StockR1.Trim()+“”+correctDepotHolding.StockR2.Trim();
//获取保管人信息
foreach(ccHoldList中的var ccHolding)
{
如果(correctdepholding.ClientNo!=ccHolding.ClientNo)继续;
如果(correctedDepotholding.Depot!=ccHolding.Depot)继续;
如果(correctdepholding.StockCode!=ccHolding.StockCode)继续;
如果(correctdepholding.quantityhold!=ccHolding.quantityhold)继续;
reportLine.保管人=ccHolding.保管人;
打破
}
reportList.Add(reportLine);
}

您可以将数据从查找列表移动到字典中,其中键是您正在搜索的3个项目的唯一散列。然后,您将有非常快速的查找,并节省数百万次迭代。

查看我的完整帖子:

利用Linq内部连接,这将为您工作

var list =  ( from x in entity
           join y in entity2 
          on new { x.field1, x.field2 } 
        equals new { y.field1, y.field2 }
        select new entity { fields to select}).ToList();
多域上linq的连接

EmployeeDataContext edb= new EmployeeDataContext();
var cust = from c in edb.Customers
           join d in edb.Distributors on
             new { CityID = c.CityId, StateID = c.StateId, CountryID = c.CountryId,
                   Id = c.DistributorId }   
           equals
             new { CityID = d.CityId, StateID = d.StateId, CountryID = d.CountryId,
                   Id = d.DistributorId }   
           select c;


使用LINQ加入列表并按您喜欢的方式返回

乙二醇

要进行outter加入,可以使用DefaultIfEmpty() 本例将连接的右侧部分设置为默认对象(通常为空),以用于未进行连接的情况

乙二醇


正如Pranay所说,加入可能是您想要的:

var query = from correct in correctDepotHoldings
            join ccHolding in ccHoldList
              on new { correct.ClientNo, correct.Depot,
                       correct.StockCode, correct.QuantityHeld }
              equals new { ccHolding.ClientNo, ccHolding.Depot,
                           ccHolding.StockCode, ccHolding.QuantityHeld }
            // TODO: Fill in the properties here based on correct and ccHolding
            select new StocksHeldInCustody { ... };
var reportList = query.ToList();

在对象中创建一个所有变量的散列,并且只检查这些变量,它必须快速运行,那么数据的来源是什么?如果它是一个像样的数据库,那么最好在这一方面完成。更新了我的一般答案,详细介绍了如何在linqThat中执行外部联接。联接语法无效。请看我的答案以获得一个正确的例子。嗨,我在关键字“equals”和“ccHolding”上有错误,我需要在使用它之前声明它为变量吗?@DavidJohnson:Oops,忘记了“in”部分。查看我的编辑-如果你是LINQ的新手,我会留出一些时间来全面学习。谢谢你-我正在尝试,但如果它只是随机编造的,没有任何模式,我想这只是一个学习的例子!!再次感谢。乔恩,我修正了我的问题,你能帮忙吗?@DavidJohnson:现在不行-但是如果你搜索“左外联林克”,你会得到很多点击率。
from a in list1
join b in list2
    on new { a.Prop1, a.Prop2 } equals
       new { b.Prop1, b.Prop2 } 
into outer
from b in outer.DefaultIfEmpty()
select new 
    Prop1 = a.Prop1,
    Prop2 = b != null ? b.Prop2 : "Value for Prop2 if the b join is null"
}
var query = from correct in correctDepotHoldings
            join ccHolding in ccHoldList
              on new { correct.ClientNo, correct.Depot,
                       correct.StockCode, correct.QuantityHeld }
              equals new { ccHolding.ClientNo, ccHolding.Depot,
                           ccHolding.StockCode, ccHolding.QuantityHeld }
            // TODO: Fill in the properties here based on correct and ccHolding
            select new StocksHeldInCustody { ... };
var reportList = query.ToList();