【问题标题】:How can I combine an IEnumerable(Of IEnumerable) using LINQ?如何使用 LINQ 组合 IEnumerable(Of IEnumerable)?
【发布时间】:2014-02-10 21:02:05
【问题描述】:

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

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

我很确定我可以用.Aggregate().Accumulate() 做点什么。

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

【问题讨论】:

    标签: c# .net vb.net linq


    【解决方案1】:

    您可以使用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))
    

    【讨论】:

    • @CSharpie 没有必要。 Distinct 本质上是创建一个哈希集,然后枚举它,因此只需选择一个新的哈希集即可节省一步。
    • 这不会按照问题的要求返回一个不同的列表。添加对 Distinct 的调用。
    • 确实,你是对的。我很惊讶没有抛出异常:)
    • @Crono1981 如果您尝试添加已存在的元素,哈希集不会抛出异常,它只会返回 false。这是哈希集特别有用的原因之一。
    • 是的,但是对于构造函数来说,没有办法获取这些信息,所以我仍然感到惊讶。在创建哈希集时要记住这一点:它不一定具有与原始列表相同的对象计数。 :)
    【解决方案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 来懒惰地执行选择,并且不使用中间集合 results。最后,完整的签名实际上是public static IEnumerable<TResult> SelectMany<TSource, TResult>( this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector),但唯一要理解的重要部分是选择器返回一个集合。如果你有一个集合的集合,那么使用标识函数 x =&gt; x 就可以做到这一点。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-29
        • 2020-09-23
        • 2012-09-17
        • 2012-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多