提问者:小点点

通过递归方法调用生成字符串


我有如下的类结构(简化):

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的实例可以包含相同类型的实例列表以及MyObject1MyObject2的列表。

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

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值,最后将带有MyObject1MyObject2SimpleName组合字符串追加到两个对象的Name属性。

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

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

我正在努力寻找一种方法来递归地迭代列表并跟踪正在构造的名称。


共2个答案

匿名用户

尝试如下所示:

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>();

        public string GetName()
        {
            return $"{InstanceName}-{string.Join('-',MyBaseTypeList.Select(q => q.GetName()))}";
        }
    }

匿名用户

您可以尝试在传递基标识符的地方应用decorator模式。

将此方法添加到MyBaseType类中;

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

        Dictionary<string, MyObject1> dict = new Dictionary<string, MyObject1>();
        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;
    }

通过这种方式,你可以得到所有对象的字典,并将它们的路径作为关键字。

您所需要的只是用一个null作为参数调用基对象中的函数。 (实例1)

但是,我将MyObject2更改为Myobject1,因为它们是相同的对象(从这个类继承)