使用Linq中的Contains在大型列表中查找

时间:2017-12-15 13:45:53

标签: c# list foreach console linq-to-excel

我有两个大的excel文件。我可以使用linqtoexcel将这些excel文件的行放入列表中。问题是我需要使用第一个列表中一个对象的字符串来查找它是否是第二个列表的对象中的另一个字符串的一部分或包含在其中。我正在尝试以下方法,但由于每个列表超过70,000个项目,因此该过程需要很长时间。

我尝试使用Any语句,但无法提取结果。如果您有任何想法,请分享。

List<ExcelOne> exOne = new List<ExcelOne>();
List<ExcelTwo> exTwo = new List<ExcelTwo>();

我能够构建第一个列表和第二个列表,并且可以验证列表中是否有对象。这是我想到如何通过列表找到匹配。请注意,一旦找到匹配项,我就想创建一个新类并将其添加到新列表中。

 List<NewFormRow> rows = new List<NewFormRow>();

        foreach (var item in exOne)
        {
             //I am going through each item in list one
            foreach (var thing in exTwo)
            {
                  //I now want to check if exTwo.importantRow has or 
                  //contains any part of the string from item.id
                if (thing.importantRow.Contains(item.id))
                {
                    NewFormRow adding = new NewFormRow()
                    {
                        Idfound = item.id,
                        ImportantRow = thing.importantRow
                    };
                    rows.Add(adding);
                    Console.WriteLine("added one");
                }
            }

如果你知道更快的方法请分享。谢谢。

1 个答案:

答案 0 :(得分:0)

很难改进这种子串方法。问题是你是否必须在这里做。你不能在填写清单的地方做到吗?那么你不需要这个额外的步骤。

但是,您可能会发现此LINQ查询更具可读性:

List<NewFormRow> rows = exOne
    .SelectMany(x => exTwo
        .Where(x2 => x2.importantRow.Contains(x.id))
        .Select(x2 => new NewFormRow
        {
            Idfound = x.id,
            ImportantRow = x2.importantRow
        }))
    .ToList();