c# - 通过递归方法调用构建字符串
问题描述
我有以下类结构(简化):
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
可以包含相同类型的实例列表以及MyObject1
and的列表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
或任一对象MyObject2
的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
我正在努力寻找一种方法来递归地遍历List<MyBaseType>
AND 跟踪正在构建的名称。
解决方案
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)
推荐阅读
- python - 以元组为用户名的 Django 自定义用户
- r - 在 r shiny 中训练机器学习模型时的“实时更新”
- angularjs - 如何将鼠标悬停在量角器中跨度元素下方的顶部
- php - 根据 Twig 哈希交互和满足 if 条件切换样式表
- python - 动态改变 wx.TextCtrl 的大小
- python - 使用 freeze_graph.py 并将 Keras 模型转换为估计器时出错
- css - Material-UI Input 组件下划线颜色
- ios - 圆形 UITableViewCell 仅底角或顶角,但它不起作用 Swift iOS 10
- java - 为什么我的 Java 进程在 docker 容器与主机之间消耗两倍的内存
- javascript - 正确确定标记是否在绘制的多边形内