簡體   English   中英

C#LINQ集合的“內部聯接”

[英]C# LINQ “inner join” of collections

基本上,我有一個IEnumerable<IEnumerable<T>>對象,並且我想從中獲取所有集合中存在的對象的IEnumerable<T>

我正在嘗試編寫盡可能優雅的代碼,並且想知道這樣做是否有一些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 }

它可以工作,但是我在這里做了幾件事情,例如兩次枚舉初始集合,創建半就緒結果以及迭代+從中刪除元素。

我很確定應該有一個選項可以通過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);

C#中是否存在類似的東西? 也許作為擴展方法? 我盡力使用LINQ Join()但是我找不到如何使它適應我的示例的方法,我會很樂於助人,很可能答案很簡單,以至於我找不到真正的答案。它。

先感謝您!

您可以使用HashSet<T>.IntersectWith

HashSet<ulong> result = data.First();
foreach (HashSet<ulong> set in data.Skip(1))
    result.IntersectWith(set);

修改當前HashSet<T>對象,使其僅包含該對象和指定集合中存在的元素。

集合與相交相結合將為您提供所有集合中存在的公共元素。

var orderedData = data.ToList();
var commonSet = orderedData.Skip(1).Aggregate((IEnumerable<ulong>)(orderedData.First()), (c, n) => c.Intersect(n));

嘗試這個:

var result = new HashSet<ulong>(
      data.SelectMany(x => x).Where(x => data.All(z => z.Contains(x)))
);

參見MSDN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM