2

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

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

但是我有第三个derived class(让我们称之为D_1_and_2),派生自同一个base classB,它接受作为其构造函数 2 个数组的参数,一个是 type D1[],另一个是 type 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]*/){}
}
4

1 回答 1

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();
    }
}
于 2016-07-30T14:45:20.797 回答