C# 父子循环,设计模式

C# 父子循环,设计模式,c#,design-patterns,C#,Design Patterns,假设我有两个类(使用C#) 类别A和B。类别A可以转换为B。类别B具有属性父级(类型B)。 我有一个实例的列表,我想将其转换为列表 类A包含知道B的哪个实例是父实例的信息 假设我在列表中循环以转换它 for(int i = 0; i < listOfA.Count;i++) { listOfB.Add(ConvertToB(listOfA[i], listOfB)); } for(int i=0;ix.Id==a.ParentId); } 如果父级尚未转换,则此代码将出错。如

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

类别A和B。类别A可以转换为B。类别B具有属性父级(类型B)。 我有一个实例的
列表
,我想将其转换为
列表

类A包含知道B的哪个实例是父实例的信息

假设我在
列表中循环以转换它

for(int i =  0; i < listOfA.Count;i++)
{
    listOfB.Add(ConvertToB(listOfA[i], listOfB));
}
for(int i=0;i
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);
}
public B ConvertToB(A A,列表B)
{
B newInstanceOfB=A作为B;
B.Parent=listOfB.FirstOrDefault(x=>x.Id==a.ParentId);
}
如果父级尚未转换,则此代码将出错。如果我们转换listofA[1],它对应的父项将是listofB[6]。在转换listofA[1]时,它将不可用

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

编辑:

A是一个具有B也具有的某些属性的属性。A和B没有关系。 B也可以有一个允许的孩子的名单。此
列表
由属于列表B列表的项目组成

因此f.ex:listofA[0]将转换为listofB[0]。 listofB[0]具有父listofB[4]和允许的子项{listofB[7],listofB[8]}


很抱歉之前没有提到这一点。

您真的需要设计模式吗?你可以做两个循环。第一个将创建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
}
var listOfB=listOfA.Cast().ToList()
foeach(列表b中的变量b)
{
b、 Parent=listOfB.FirstOrDefault(x=>x.Id==b.ParentId);//这将起作用,因为存在明确的继承,所以b拥有A拥有的所有属性
}

listOfA
listOfB
的转换太复杂,不能仅仅是一个循环:您应该将其封装在一个方法中,比如:

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

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

父实例可以有一个循环,还是严格地说是一个树?这可能很明显,但a是从B继承的,对不对?a和B实际上并不相关。A是一个属性,B是另一个类。有了A的属性,你可以填写B的大部分内容。正如在一篇评论中所说的,你不能只是将A转换成B。这有点复杂。请参阅“编辑”部分。@user1613512那么您必须有将A转换为B的方法。而B具有ParentId应该不会有问题。
public static class ListOfBEx
{
    static void appendAll(this List<B> instance, List<A> listOfA) 
    {
        // almost the same implementation
    }
}