我有两个集合,每个集合包含大约 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/