我有一个列表,我想找到这样的交叉点:

var list1 = new List<int>() { 1, 2, 3 };
var list2 = new List<int>() { 2, 3, 4 };
var list3 = new List<int>() { 3, 4, 5 };
var listOfLists = new List<List<int>>() { list1, list2, list3 };

// expected intersection is List<int>() { 3 };

有没有什么方法可以用IEnumerable.Interselect()做到这一点呢?

编辑:

解决方案

谢谢你所有精彩的回答.原来有四个选项可以解决这个问题:List+aggregate(@Marcel Gosselin),List+foreach(@JaredPar,@Gabe Moothart),HashSet+aggregate(@jesperll)和HashSet+foreach(@小马托尼).我对这些解决方案进行了一些性能测试(每个列表中有number of listsnumber of elements个,大小各有random number max个不同).

事实证明,在大多数情况下,哈希集的性能都比列表好(除了大列表和小随机数大小,因为我猜哈希集的性质)

对我来说,聚合方法真的很有吸引力(我认为这是公认的答案),但我不会说它是最具可读性的解决方案..再次感谢大家!

推荐答案

不如:

var intersection = listOfLists
    .Skip(1)
    .Aggregate(
        new HashSet<T>(listOfLists.First()),
        (h, e) => { h.IntersectWith(e); return h; }
    );

这样,通过在整个过程中使用相同的HashSet,并且仍然在单个语句中,可以对其进行优化.只需确保listOfList始终包含至少一个列表即可.

.net相关问答推荐

MSBuild:CopyToOutputDirectory不会将本机DLL复制到输出

Docker镜像mcr.microsoft.com/dotnet/aspnet:8.0不能在Windows上构建

在 F# 中处理 Option - Some(null) 的好策略是什么

如何查询 DOTNET_CLI_TELEMETRY_OPTOUT 是否永久设置为 TRUE?

dotnet ef dbcontext scaffold command --data-annotations 或 -d 命令行参数似乎不起作用

在 C# 中,如何使用泛型的基类将泛型接口的所有实例注入到单个构造函数中?

SqlDateTime.MinValue != DateTime.MinValue,为什么?

.NET 中工作线程和 I/O 线程的简单描述

如何从 .net 中的数组类型获取数组项类型

是否有 TLS 1.2 的 .NET 实现?

Mono 是树莓派

如何在 C# 中将 null 值设置为 int?

在 C#/.NET 中组合路径和文件名的最佳方法是什么?

DataGridView 在我的两个屏幕之一上的可怕重绘性能

我应该绑定到 ICollectionView 还是 ObservableCollection

如何在 Dapper.Net 中编写一对多查询?

找不到 System.Windows.Media 命名空间?

可以从 C# 调用 C++ 代码吗?

在 C#/.NET 中合并两个图像

无法添加对 dll 的引用