如何展平 IEnumerables 的 IEnumerables 的串联

Posted

技术标签:

【中文标题】如何展平 IEnumerables 的 IEnumerables 的串联【英文标题】:How to flatten out the concatenation of IEnumerables of IEnumerables 【发布时间】:2016-12-05 03:13:52 【问题描述】:

我知道某处有LINQ 解决方案,我只是看不到它。我的情况是这样的:我有一个base class(现在我们称之为B)接受一个可变参数并使用它来初始化一个readonly字段,它恰好是一个@ 987654324@(我们称这个字段为 List)。

我有两个 derived classes(我们称它们为 D1D2)用它们的 vararg 参数做完全相同的事情,将它传递给 base class 构造函数,没问题那里。

但是我有第三个derived class(让我们称之为D_1_and_2),派生自同一个base class,B,它接受作为其构造函数2个数组的参数,一个D1[]和另一个类型为D2[]

我的问题是,不知何故,我必须将第一个参数(D1[] 参数)List 字段的所有元素彼此以及第二个参数的List 字段的所有元素连接起来,并将结果数组传递给@ 987654334@施工期间。波纹管是代码中问题的说明。

public class CollectionElement




public class BaseClass

    public readonly IReadOnlyCollection<CollectionElement> TheCollection;

    public BaseClass(params CollectionElement[] arg)
    
        TheCollection = Arrays.AsReadOnly(arg);
    


public class DerivedClassA : BaseClass

    public DerivedClass(params CollectionElement[] arg)
        :base(arg)


public class DerivedClassB : BaseClass

    public DerivedClass(params CollectionElement[] arg)
        :base(arg)


public class DerivedClassA_Plus_B : BaseClass

    public DerivedClass(DerivedClassA[] argA, DerivedClassB[] argB)
        :base(/*[don't know]*/)

【问题讨论】:

【参考方案1】:

我认为您正在寻找 Enumerable.SelectMany 投影然后展平元素,然后 Enumerable.Concat 将两个序列连接在一起。

public class DerivedClassA_Plus_B : BaseClass

    public DerivedClass(DerivedClassA[] argA, DerivedClassB[] argB)
        :base(Combine(argA, argB))  

    private static CollectionElement[] Combine(DerivedClassA[] argA, DerivedClassB[] argB)
    
        var a = argA.SelectMany(x => x.TheCollection);
        var b = argB.SelectMany(x => x.TheCollection);
        return a.Concat(b).ToArray();
    

【讨论】:

就是这样!谢谢!

以上是关于如何展平 IEnumerables 的 IEnumerables 的串联的主要内容,如果未能解决你的问题,请参考以下文章

按值比较迭代类型(IEnumerables及其亲属)(以检查相等性)

如何将展平的对象序列化回服务器,在 RestKit 中未展平

如何展平钳位数组

如何在pytorch中展平张量?

如何展平此数据框

如何展平(int,dictionary)的字典?