如何展平 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
(我们称它们为 D1 和 D2)用它们的 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及其亲属)(以检查相等性)