C#递归,当一个类包含另一个类的对象时

时间:2016-05-10 22:31:00

标签: c# recursion

我遇到了以下问题 - 我有两个课程:

public class Component
{
    public string Name { get; set; }
    public string UnitOfMeasure { get; set; }
    public List<Ingredient> Ingredients { get; set; }

    public Component()
    {
        Ingredients = new List<Ingredient>();
    }

}

public class Ingredient
{
    public int Quantity { get; set; }
    public Component Component { get; set; }

}

如您所见,Ingredient类包含Component类型的对象,Component内有List Ingredients。 我的问题是 - 如何创建一个可以检查每个Component(来自数据库)的函数,进入List,检查它,如果它不是空的则更深入,但如果是,返回并检查List的其他元素。

如果我的解释不好,我很抱歉。

2 个答案:

答案 0 :(得分:1)

这是一个函数,它将返回通过迭代成分找到的所有组件的列表。它将通过引用检查它不包含多个组件。如果您在代码中复制组件,意味着同一组件有多个实例,则需要进行相等检查以代替foundcomponents.Contains。

function IList<Component> GetAllComponents(Component startingComponent) {
    IList<Component> foundcomponents = new List<Component>();
    foundcomponents.Add(startingComponent);
    int searchindex = 0;
    while(searchindex<foundcomponents.Count) {
        Component c = foundcomponents[searchindex];
        if(c.Ingredients!=null) {
            foreach(Ingredient i in c.Ingredients) {
                if(i.Component!=null && foundcomponents.Contains(i.Component)) {
                    foundcomponents.Add(i.Component);
                }
            }
        }
        searchindex++;
    }
    return foundcomponents;
}

答案 1 :(得分:1)

问题仍然含糊不清,因为我们不知道你想要的结果是什么,但是根据你想要做什么,这里有你可能需要的骨架。

public void DeepDive(Component component) {
var currentIngredients = component.Ingredients;
//This only works because the List is already initialized in the Component constructor.
if(currentIngredients.Any())
    foreach(Ingredient ingredient in currentIngredients) {
        //do stuff
        if(ingredient.Component != null)
            DeepDive(ingredient.Component);
    }
}