繁体   English   中英

比较 LINQ 中的两个列表是否有重复项

[英]Compare two lists in LINQ with duplicates

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

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 个重复项,如果list2中有什么,它们包含“myFile”部分。

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

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

您可以通过在第一个列表上运行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" }
    }
}

使用 Enumerable.Intersect 方法

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

试试看

dupeList.GroupBy(t=>t)
        .Select(t=> new {Val=t.Key,Count=t.Count()})
        .Where(t=>t.Count>1)
        .Select(t=>t.Val).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM