Linq和二进制搜索 - 改进这个缓慢的Where语句?

Sco*_*ach 3 c# linq binary-search

我有两个系列,每个系列包含大约40,000个项目.

列表2中的元素通过外键链接到列表1的元素.

对于列表一的每个元素,我想在列表二中找到相应的元素.

像这样的东西:

foreach(var item in list1)
{
  var match = list2.Where(child => child.ID == item.ChildID).FirstOrDefault();
  item.Child = match;
}
Run Code Online (Sandbox Code Playgroud)

这有效,但它很慢.

现在,list1和list2都是按照这些键从数据库中排序的.因此list1按ChildID排序,list2按ID排序(相同值).

我认为二进制搜索会大大提高速度,但我在某处读到了Linq会在Where子句中为列表选择最合适的策略.也许我需要明确地转换为排序列表?或者我可能需要使用比较器实现自定义二进制搜索算法?

任何见解都表示赞赏.

谢谢.

jer*_*lan 11

为什么不使用加入?

var query = 
   from a in list1
   join b in list2 on a.ChildID equals b.ID
   select new {Item1 = a, Item2 = b};

foreach(var item in query)
{
   item.Item1.Child = item.Item2;
}
Run Code Online (Sandbox Code Playgroud)

  • ph0enix,你愿意解释为什么这会更快.出于好奇.TIA. (2认同)