如何平整IEnumerables的IEnumerables连接

时间:2016-07-30 14:43:45

标签: c# arrays linq readonly readonly-collection

我知道某处有一个LINQ解决方案,我无法看到它。我的情况是这样的:我有一个base class(现在称之为 B )接受一个vararg并使用它来初始化readonly字段,成为IReadonlyCollection(让我们调用此字段列表)。

我有两个derived classes(让我们称之为 D1 D2 )与他们的vararg参数完全相同,将其传递给base class构造函数,没有问题。

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

我的问题是,不知何故,我必须将第一个参数的所有元素(D1[]参数)List字段相互连接,并与第二个参数的所有元素连接起来。 List字段,并在构建期间将生成的数组传递给base class。贝娄是代码中问题的一个例子。

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 个答案:

答案 0 :(得分:4)

我认为您正在寻找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();
    }
}