[英]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.