如何使用LINQ组合IEnumerable(IEnumerable)?

时间:2014-02-10 21:02:05

标签: c# .net vb.net linq

我有List(Of HashSet(Of String))。是否有一种清晰的单行LINQ方式来获取包含列表条目值中所有字符串的单个HashSet(Of String)

例如,从3个哈希集{“A”},{“A”,“B”,“C”}和{“B”,“C”,“D”}我想要一个hashset {“A”,“B”,“C”,“D”}。

我很确定我可以使用.Aggregate().Accumulate()执行某些操作。

C#或VB.NET解释同样有用。

3 个答案:

答案 0 :(得分:7)

您可以使用SelectMany。在C#中:

var newHashSet = new HashSet<string>(myListOfHashSets.SelectMany(x => x));

在VB.NET中:

Dim newHashSet As New HashSet(Of String)(myListOfHashSets.SelectMany(Function (x) x))

答案 1 :(得分:2)

SelectMany就是这样做的。在高级别(省略泛型和简化一点),SelectMany实现如下:

static IEnumerable SelectMany(this source, Func selector)
{
    IEnumerable results;
    foreach (var item in source)
    {
        foreach (var result in selector(item))
        {
            results.add(result);
        }
    }
    return results;
}

以上代码实际上并不准确;相反,它使用yield return来懒惰地执行select,并且不使用中间集合results。最后,完整签名实际上是public static IEnumerable<TResult> SelectMany<TSource, TResult>( this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector),但唯一要理解的是选择器返回一个集合。如果你有一个集合集合,那么使用标识函数x => x就是这样做的。

因此,它将集合集合展平为单个集合。使用标识函数x => x作为选择器意味着内部集合的元素不变。所以,正如其他一些人发布的那样,最终的答案是:

var newSet = new HashSet(setOfSets.SelectMany(element => element));

答案 2 :(得分:1)

您可以尝试使用HashSet的UnionWith方法。它将是这样的:

var result = myListOfHashSets.Aggregate(new HashSet<string>(), (x, y) => { x.UnionWith(y); return x; });