c# - 基于另一个列表快速提取列表的方法

标签 c#

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;

Demo

编辑

由于@Oleksandr Pshenychnyy 假设如此大的集合会非常慢,这里有一个演示,其中 list1 中有 100000 个随机字符串,list2 中有 500000 个字符串,其范围与问题中的范围相同。它在 ideone 上执行时间为 600 毫秒:

http://ideone.com/rB6LU4

关于c# - 基于另一个列表快速提取列表的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15246490/

相关文章:

c# - 如何将此 C# 工作线程代码与共享数据变量的主线程分离?

java - c#模型抽象和泛型,像Java一样强制转换未知泛型

c# - 在 .NET 中使用 Ambient 属性?

c# - smtp异常 "failure sending mail"

c# - 为什么 Java 有虚拟扩展方法而不是像 C# 那样有静态扩展方法?

c# - 下载文件时浏览器不显示进度条

c# - 将 Include() 调用替换为 Select()

c# - 如何将 json 数据获取到 c# 对象中?

c# - WPF:动态过滤数据网格

c# - Request.Form POSTED 变量为空