【问题标题】:Compare two lists in LINQ with duplicates将 LINQ 中的两个列表与重复项进行比较
【发布时间】:2019-11-12 21:25:17
【问题描述】:

我使用这段代码来比较我的两个列表:

private void CompareLists(List<string> list1, List<string> list2)
{
    List<string> commonList = list2.Where(g => list1.Any(x => g.Contains(x))).ToList();
}  

list2 包含 15000 多个项目,这些项目是位于我的网络中的文件的路径,类似于 \\myserver\direcory\subdir\myfile.pdf

list1 包含我从 Excel 工作表中获得的项目,对于我的测试有 29 个项目,包括 3 个重复项,如果 中的内容它们包含 'myFile' 部分>list2

在我的 CompareLists 函数之后,commonList 仅包含 26 个项目,其中 3 个是重复项。
如何修改我的 LINQ 查询以在 commonList 中包含这些重复项?

编辑:此处不能使用相交,因为 list1 项仅包含 list2 项中的部分内容。

【问题讨论】:

标签: c# linq


【解决方案1】:

您可以通过在第一个列表上运行Select 来获得所需的结果,然后在第二个列表中找到匹配的元素,最后丢弃第一个列表中不匹配的元素。这样,生成的元素来自第二个列表,但列表的结构与第一个列表的结构匹配:

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{

    private static List<string> CompareLists2(List<string> list1, List<string> list2)
    {
        List<string> commonList = list1
           .Select(l1 => list2.FirstOrDefault(l2 => l2.Contains(l1)))
           .Where(x => x != null)
           .ToList();
        return commonList;
    }  


    public static void Main()
    {
        var list2 = new List<string> { "/folder/foo", "/folder/bar", "/folder/baz" }; 
        var list1 = new List<string> { "bar", "baz", "baz" };

        var result = CompareLists2(list1,list2);
        // result is { "/folder/bar", "/folder/baz", "/folder/baz" }
    }
}

【讨论】:

    【解决方案2】:

    使用 Enumerable.Intersect 方法

    List<string> commonList = list1.Intersect(list2).ToList();
    

    试试看

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2021-10-28
      相关资源
      最近更新 更多