Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C“LINQ”;“内部连接”;收藏_C#_.net_Linq_Collections_Lambda - Fatal编程技术网

C# C“LINQ”;“内部连接”;收藏

C# C“LINQ”;“内部连接”;收藏,c#,.net,linq,collections,lambda,C#,.net,Linq,Collections,Lambda,基本上我有一个IEnumerable对象,我想从中得到IEnumerable所有集合中存在的对象 我正在尽可能优雅地编写代码,我想知道是否有一些LINQ技巧可以做到这一点,最好是一行。如果有帮助,两个IEnumerable都是ISet 目前,我使用的代码与以下类似: // Some starting data - collection of collections HashSet<HashSet<ulong>> data = new HashSet<HashSet&

基本上我有一个
IEnumerable
对象,我想从中得到
IEnumerable
所有集合中存在的对象

我正在尽可能优雅地编写代码,我想知道是否有一些LINQ技巧可以做到这一点,最好是一行。如果有帮助,两个
IEnumerable
都是
ISet

目前,我使用的代码与以下类似:

// Some starting data - collection of collections
HashSet<HashSet<ulong>> data = new HashSet<HashSet<ulong>> { new HashSet<ulong> { 1, 2, 3 }, new HashSet<ulong> { 2, 3, 4 }, new HashSet<ulong> { 3, 4, 5 } };

// Flatten collection of collections into a single collection with unique elements
HashSet<ulong> result = new HashSet<ulong>(data.SelectMany(set => set));

// Remove from it all elements that are missing from 1 or more initial collections
result.RemoveWhere(number => data.Any(set => !set.Contains(number)));

// The result is: HashSet<ulong> { 3 }
//一些起始数据-集合的集合
HashSet data=newhashset{newhashset{1,2,3},newhashset{2,3,4},newhashset{3,4,5};
//将集合集合展平为具有唯一元素的单个集合
HashSet result=newhashset(data.SelectMany(set=>set));
//从中删除1个或多个初始集合中缺少的所有元素
result.RemoveWhere(number=>data.Any(set=>!set.Contains(number));
//结果是:HashSet{3}
这是可行的,但我在这里做了几件事,比如枚举初始集合两次,创建一个半就绪的结果,以及迭代+从中删除元素

我很确定LINQ应该有一个一气呵成的选择,我基本上是在寻找这样的东西:

HashSet<HashSet<ulong>> data = new HashSet<HashSet<ulong>> { new HashSet<ulong> { 1, 2, 3 }, new HashSet<ulong> { 2, 3, 4 }, new HashSet<ulong> { 3, 4, 5 } };elements
HashSet<ulong> result = data.LinqInnerJoinMagic(set => set);
HashSet data=newhashset{newhashset{1,2,3},newhashset{2,3,4},newhashset{3,4,5};元素
HashSet result=data.LinqInnerJoinMagic(set=>set);
C#中是否存在类似的东西?也许作为一种扩展方法?我努力使用LINQ
Join()
,但我不知道如何将其应用到我的示例中,我非常感谢您的帮助,答案很可能很简单,我真的找不到


提前谢谢你

聚合与intersect结合将获得所有集合中存在的公共元素

var orderedData = data.ToList();
var commonSet = orderedData.Skip(1).Aggregate((IEnumerable<ulong>)(orderedData.First()), (c, n) => c.Intersect(n));
var orderedData=data.ToList();
var commonSet=orderedData.Skip(1).Aggregate((IEnumerable)(orderedData.First()),(c,n)=>c.Intersect(n));
您可以使用:

HashSet result=data.First();
foreach(数据中的HashSet.Skip(1))
结果:与(集合)相交;
修改当前的
HashSet
对象,使其仅包含 存在于该对象和指定集合中

试试这个:

var result = new HashSet<ulong>(
      data.SelectMany(x => x).Where(x => data.All(z => z.Contains(x)))
);
var result=新哈希集(
data.SelectMany(x=>x)。其中(x=>data.All(z=>z.Contains(x)))
);

是的,我意识到我错了,我已经删除了那条评论。我现在真的很好奇哪条评论的性能最好…:)如果我没有
HashSet
给我的
IntersectWith()
的魔力,这将是我的前2个选择。如果您的初始数据不是
IEnumerable
,我建议使用它,我想它适用于所有情况,如果有人不想使用HashSet,那么他可以添加
Distinct()
,感谢您提供了一个很好的Linq解决方案!有趣的是,我知道
IntersectWith()
,但出于某种原因,我没有想到如此明显的解决方案。。。我选择它作为最佳答案,因为它所列举的
数据远远少于其他(仍然有效)LINQ建议,所以非常感谢!这一个也能正常工作,很好地解决了我的问题,所以我也对它投了更高的票。多谢各位!
var result = new HashSet<ulong>(
      data.SelectMany(x => x).Where(x => data.All(z => z.Contains(x)))
);