2016-07-30 39 views
2

我知道有一个LINQ解决方案的地方,我只是无法看到它。我的情况是这样的:我有一个base class(可以称之为,现在)接受一个可变参数,并使用它来初始化一个readonly场,这恰好是一个IReadonlyCollection(让我们称之为这一领域名单) 。 如何平展IEnumerable的IEnumerables连接

我有两个derived classes(让我们称之为 D1 D2)是做同样的事情与他们的可变参数的参数,它传递给base class构造,没有任何问题存在。

但是我有三分之一derived class(允许调用此一个 D_1_and_2),衍生自同一base class,B,接受作为其构造器2阵列,D1[]类型的一个和另一个D2[]类型的参数。

我的问题是,不知何故我来连接List字段与彼此以及与所述第二paramenter的List字段中的所有元素的第一个参数的(将D1[]参数)的所有元素,将所得数组传递到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

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

就是这样!谢谢! – FinnTheHuman