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

标签 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;
}

这行得通,但速度太慢了。

现在,列表 1 和列表 2 都根据数据库中的这些键进行排序。所以 list1 按 ChildID 排序,list2 按 ID 排序(相同值)。

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

欢迎任何见解。

谢谢。

最佳答案

为什么不使用联接?

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;
}

关于c# - Linq 和二进制搜索 - 改进这个缓慢的 Where 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1329650/

相关文章:

c# - 分割、分组和计数字符串

c# - 要命令的 XAML Setter 属性

c# - JSON 到 XML 类转换

c# - 使用 LINQ,如何将 List<List<string>> 转换为 List<string>?

algorithm - 在二进制搜索中确定中间值

java - Java中两个BigIntegers的关系操作

c# - 无窗口wpf应用程序示例?

c# - 插入错误 - 1064

c# - LINQ 中的对象引用错误

algorithm - 寻边 二分搜索