首页 > 解决方案 > 通过递归方法调用构建字符串

问题描述

我有以下类结构(简化):

public class MyBaseType
{
    public string InstanceName { get; set; }
    public List<MyBaseType> MyBaseTypeList = new List<MyBaseType>();
    public List<MyObject1> MyObject1List = new List<MyObject1>();
    public List<MyObject2> MyObject2List = new List<MyObject2>();
    // Other properties
}

public class MyObject1
{
    public string SimpleName { get; set; }
    public string Name { get; set; }
    // Other properties
}

public class MyObject2
{
    public string SimpleName { get; set; }
    public string Name { get; set; }
    // Other properties
}

如您所见, 的实例MyBaseType可以包含相同类型的实例列表以及MyObject1and的列表MyObject2

对我来说,一个典型的用途是呈现如下所示的结构:

MyBaseType instance1
|-> InstanceName = "instance1"
|
|-> MyBaseType instance2
|   |-> InstanceName = "instance2"
|   |
|   |-> MyObject1 object1_1
|   |   |-> SimpleName = "object1_1"
|   |-> MyObject2 object2_1
|   |   |-> SimpleName = "object2_1"
|
|-> MyBaseType instance3
|   |-> InstanceName = "instance3"
|   |
|   |-> MyObject1 object1_2
|   |   |-> SimpleName = "object1_2"
|   |-> MyObject2 object2_2
|   |   |-> SimpleName = "object2_1"
|
|-> MyObject1 object1_3
|   |-> SimpleName = "object1_3"
|-> MyObject2 object2_3
|   |-> SimpleName = "object2_3"

显然,这种结构会变得相当复杂。

然而,我需要做的是递归地深入MyBaseType列表,跟踪所有InstanceName值,最后将组合字符串附加到SimpleName其中一个MyObject1或任一对象MyObject2Name属性。

按照上面的结构示例,名称将是:

MyObject1 object1_1 : instance1_instance2_object1_1
MyObject1 object2_1 : instance1_instance2_object2_1
MyObject1 object1_2 : instance1_instance3_object1_1
MyObject1 object2_2 : instance1_instance3_object1_2
MyObject1 object1_3 : instance1_object1_3
MyObject1 object2_3 : instance1_object2_3

我正在努力寻找一种方法来递归地遍历List<MyBaseType>AND 跟踪正在构建的名称。

标签: c#.netstringrecursionnested

解决方案


you could try to apply the decorator pattern where you pass your base identifier.

Add this method to your MyBaseType Class;

public Dictionary<string,MyObject1> GenerateString(string bString)
    {
        if(bString != null) bString += "_";

        Dictionary<string, Object> dict = new Dictionary<string, Object>();
        if (MyBaseTypeList.DefaultIfEmpty() != null)
        {
             dict = this.MyBaseTypeList.Select(s => s.GenerateString(bString + InstanceName)).SelectMany(d => d).ToDictionary(e => e.Key, e => e.Value);
        }

        MyObject1List.ForEach(myObject => dict.Add(bString + InstanceName + "_" + myObject.SimpleName,myObject));
        MyObject2List.ForEach(myObject => dict.Add(bString + InstanceName + "_" + myObject.SimpleName,myObject));

        return dict;
    }

this way u get a dictonary of all the objects with their path as a key.

all you need is to call the function in the base object with a null as parameter. (instance1)


推荐阅读