gpt4 book ai didi

c# - Linq 选择嵌套列表的公共(public)子集

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:52 30 4
gpt4 key购买 nike

我将从我的数据结构开始。

class Device
{
public List<string> Interfaces { get; set; }
}

List<Device> allDevices;

我想使用 Linq 查询来选择 allDevices 列表中每个设备中存在的所有接口(interface)(字符串)。

提前致谢。

更新:
感谢 Aron,我设法解决了这个问题。
这是我的解决方案:
List<string> commonInterfaces = allDevices.Select(device => device.Interfaces)
.Cast<IEnumerable<string>>()
.Aggregate(Enumerable.Intersect)
.ToList();

最佳答案

您可以使用 Enumerable.Intersect , 例如:

IEnumerable<string> commonSubset = allDevices.First().Interfaces;
foreach (var interfaces in allDevices.Skip(1).Select(d => d.Interfaces))
{
commonSubset = commonSubset.Intersect(interfaces);
if (!commonSubset.Any())
break;
}

DEMO

如果你想重用它,你可以把它变成一个扩展方法:
public static IEnumerable<T> CommonSubset<T>(this IEnumerable<IEnumerable<T>> sequences)
{
return CommonSubset(sequences, EqualityComparer<T>.Default);
}

public static IEnumerable<T> CommonSubset<T>(this IEnumerable<IEnumerable<T>> sequences, EqualityComparer<T> comparer)
{
if (sequences == null) throw new ArgumentNullException("sequences");
if (!sequences.Any()) throw new ArgumentException("Sequences must not be empty", "sequences");

IEnumerable<T> commonSubset = sequences.First();
foreach (var sequence in sequences.Skip(1))
{
commonSubset = commonSubset.Intersect(sequence, comparer);
if (!commonSubset.Any())
break;
}
return commonSubset;
}

现在用法很简单(比较器可以用于自定义类型):
var allInterfaces = allDevices.Select(d => d.Interfaces);
var commonInterfaces = allInterfaces.CommonSubset();
Console.Write(string.Join(",", commonInterfaces));

关于c# - Linq 选择嵌套列表的公共(public)子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18488955/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com