父子循环,设计模式

时间:2014-02-17 21:58:56

标签: c# design-patterns

假设我有两个类(使用C#)。

A类和B类.A类可以转换为B.B类有一个属性Parent(类型B)。 我有一个List<A>个A实例,我想将其转换为List<B>

A类包含了解B的哪个实例是父项的信息。

假设我通过我的List<A>循环转换它。

for(int i =  0; i < listOfA.Count;i++)
{
    listOfB.Add(ConvertToB(listOfA[i], listOfB));
}

ConvertToB方法创建一个B实例并搜索listOfB,如果它的父元素已经存在。

所以让我们说ConvertToB看起来像这样:

public B ConvertToB(A a, List<B> listOfB)
{
   B newInstanceOfB = A as B;
   B.Parent = listOfB.FirstOrDefault(x => x.Id == a.ParentId);
}

如果尚未转换父代码,则此代码将出错。 F.ex如果我们转换listofA [1],它的相应父级将是listofB [6]。在我们想要转换listofA [1]时将无法使用。

我的问题是如何以干净的面向对象的方式解决这个问题。可以使用什么样的设计模式(GOF)来解决这个问题。

修改

A是具有B也具有的一些属性的属性。 A和B无关。 B还可以列出允许的孩子。此List<B>由属于listofB列表的项目组成。

所以f.ex:listofA [0]将被转换为listofB [0]。 listofB [0]有一个父listofB [4]并允许孩子{listofB [7],listofB [8]}

很抱歉没有提到这个。

2 个答案:

答案 0 :(得分:2)

你真的需要一种设计模式吗?你可以做2个循环。首先将创建B实例,第二个将查找并设置父项。你甚至可以使用LINQ。

var listOfB = listOfA.Cast<B>().ToList()

foeach(var b in listOfB)
{
    b.Parent = listOfB.FirstOrDefault(x => x.Id == b.ParentId); // this will work because there is clear inheritance so B has all properties A has
}

答案 1 :(得分:0)

listOfAlistOfB的转换过于复杂而不仅仅是一个循环:您应该将其封装在一个方法中,让我们说:

public List<B> ConvertToListOfB(List<A> listOfA)
{
   // The previous answer is quite good
}

如果您想为同一listOfA添加多个listOfB,则可以使用课程List<B>的扩展方法:

public static class ListOfBEx
{
    static void appendAll(this List<B> instance, List<A> listOfA) 
    {
        // almost the same implementation
    }
}

封装很好,因为在第一个循环之后,B的新实例处于不完整状态(缺少父级)。