List1: {"123456", "432978", "321675", …} // containing 100,000 members
List2: {"7674543897", "1234568897", "8899776644",…} // containing 500,000 members
我想提取 List2 中前 6 位来自 List1 成员的所有项目,所以这里字符串“1234568897”是有效的,因为它的前 6 位来自 List1 的第一个项目。 最快的方法是什么?
foreach(string id in List1)
{
string result = List2.FirstOrDefault(x => x.Contains(id));
if(result!=null)
{
//some works here
}
}
这适用于少于 1000 人的群体,但当 List2 项目增长时,这会花费太长时间
最佳答案
您可以使用 Enumerable.Join
这是quite efficient :
var match = from str1 in List1
join str2 in List2
on str1 equals (str2.Length < 6 ? str2 : str2.Substring(0, 6))
select str2;
编辑
由于@Oleksandr Pshenychnyy 假设如此大的集合会非常慢,这里有一个演示,其中 list1 中有 100000 个随机字符串,list2 中有 500000 个字符串,其范围与问题中的范围相同。它在 ideone 上执行时间为 600 毫秒:
关于c# - 基于另一个列表快速提取列表的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15246490/