分层列表返回根和最高级别的父



我正在尝试构建一个基本的依赖注入容器,以使自己更好地了解它们的工作方式。我的容器的部分之一是将一个别名映射到班级名称。然后可以递归映射此类以产生层次列表。它还必须处理映射到自身的情况。

例如,说我有以下映射:

var map = new List<Map>() {
    { new Map("Foo", "Foo") },
    { new Map("foo", "Foo") }
};

地图是:

public class Map {
    public string Name { get; set; }
    public string Class { get; set; }
    public Map(string name, string @class) {
        Name = name;
        Class = @class;
    }
}

我想编写一个方法(getMap),该方法将返回给定名称的根(名称)和最高级别的父(类)。例如,我说:

var map = GetMap(map, "Foo");
var map2 = GetMap(map, "foo");

两个变量都将返回带有名称" foo"和类" foo"的新地图。这是进一步解释的另一个例子。给定以下地图:

var map = new List<Map>() {
    { new Map("Foo", "FooExtended") },
    { new Map("foo", "Foo") }
};

它将产生一个名称为" foo"和类" fooxtended"的新地图。

这是我的第一次尝试:

private Map GetMap(List<Map> map, string @class, string name = null) {
    var item = map.SingleOrDefault(m => m.Name == @class);
    if (item != null && @class != item.Class) {
        return GetMap(map, item.Class, @class);
    } else {
        return new Map(name ?? @class, @class);
    }
}

这两个示例都正确地返回了带有正确类的地图。但是,两个示例返回的名称都是" foo"。这应该是" foo",因为这是层次结构的根。

我希望我已经很好地解释了这一点。如果有人可以告诉我我做错了什么,我会很感激。谢谢

尝试此

public Map GetMap(List<Map> map, string name, string finalName = null) {
    var item = map.SingleOrDefault(m => m.Name == name);
    if (item != null && name != item.Class) {
        return GetMap(map, item.Class, finalName ?? name); // <- for you, name ?? @class
    } else {
        return new Map(finalName ?? name, name);
    }
}

您需要沿整个执行路径沿着name(或我的情况finalName)传递

编辑 - 这不是一个完整的解决方案,但我要离开

我重命名了测试中的参数,所以我更容易阅读,对此感到抱歉。

我的整个LINQPAD代码

void Main()
{
    var map = new List<Map>() {
        { new Map("FooExtended", "FooExtended2") },
        { new Map("Foo", "FooExtended") },
        { new Map("foo", "Foo") }
    };
    var newMap = GetMap(map, "foo");
    newMap.Dump(); // Gives Map("foo", "FooExtended2")
}
public class Map {
    public string Name { get; set; }
    public string Class { get; set; }
    public Map(string name, string @class) {
        Name = name;
        Class = @class;
    }
}
private static Map GetMap(List<Map> map, string name, string finalName = null) {
    var item = map.SingleOrDefault(m => m.Name == name);
    if (item != null && name != item.Class) {
        return GetMap(map, item.Class, finalName ?? name);
    } else {
        return new Map(finalName ?? name, name);
    }
}

再次编辑 - 基于注释

的实际答案

最终答案,GetMap将返回最高类型的名称(例如foo)和最低的类(例如Foo

private static Map GetMap(List<Map> map, string name) {
    return new Map(GetMapName(map, name), GetMapClass(map, name));
}
private static string GetMapName(List<Map> map, string name) {
    var item = map.SingleOrDefault(m => m.Name != name && m.Class == name);
    return item != null ? GetMapName(map, item.Name) : name;
}
private static string GetMapClass(List<Map> map, string name) {
    var item = map.SingleOrDefault(m => m.Name == name && m.Class != name);
    return item != null ? GetMapClass(map, item.Class) : name;
}

我使用了上面发布的代码,并且我得到了" foo"," fooextended2",无论我使用哪个名字或类。

希望会有所帮助。

最新更新