c# - 如何展平 IEnumerables 的 IEnumerables 的串联

标签 c# arrays linq readonly readonly-collection

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

我有两个派生类(我们称它们为D1D2),它们用它们的vararg参数执行完全相同的操作,将其传递给基类构造函数,没有问题。

但我有第三个派生类(我们称之为D_1_and_2),它派生自相同的基类 B,它接受以下参数作为参数:它的构造函数有 2 个数组,一个为 D1[] 类型,另一个为 D2[] 类型。

我的问题是,不知何故,我必须将第一个参数(D1[] 参数)List 字段的所有元素相互连接起来,并与第二个参数的所有元素连接起来列出 字段并在构造期间将结果数组传递给基类。下面是代码中问题的说明。

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]*/){}
}

最佳答案

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

关于c# - 如何展平 IEnumerables 的 IEnumerables 的串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38675142/

相关文章:

java - 检查数组的值

php - 如何获取一个类的所有公共(public)属性作为json?

javascript - 函数仅适用于硬编码值

c# - 使用 LINQ 和 Lambda 加入/在何处

c# - 放大屏幕的特定区域

c# - Uwp 在用户登录时执行后台任务

c# - Entity Framework /Linq - 获取动态指定属性的不同值

c# - 关于 linq select 和 ToList() 的问题

c# - 通过 websocket 连接同步集合

c# - 条件从使用 LEFT JOIN 的查询中排除行