【问题标题】:Algorithm to transform a structure (transitive closure?)转换结构的算法(传递闭包?)
【发布时间】:2011-11-17 16:33:15
【问题描述】:

我的源结构是一个字典,看起来像:

new Dictionary<string, string>();
dic.Add("Dinges", new List<String>() { "A", "B" });
dic.Add("Facebook", new List<String>() { "Dinges" });
dic.Add("SocialMedia", new List<String>() { "FaceBook" });
dic.Add("Medium", new List<String>() { "SocialMedia" })

或者看起来像这样的元组列表:

new List<Tuple<String, String>>();
list.Add(Tuple.Create("Dinges", "A");
list.Add(Tuple.Create("Dinges", "B");
list.Add(Tuple.Create("Facebook", "Dinges"); 
list.Add(Tuple.Create("SocialMedia", "Facebook");
list.Add(Tuple.Create("Medium", "SocialMedia");

这些是项目之间的关联,最好将其描述为继承树。 Medium是最通用的,A是最专业的。

我正在寻找一种重新排列项目的方法,如下所示:

new List<Tuple<String, String>>();
list.Add(Tuple.Create("Dinges", "A");
list.Add(Tuple.Create("Dinges", "B");
list.Add(Tuple.Create("Facebook", "Dinges"); 
list.Add(Tuple.Create("Facebook", "A");
list.Add(Tuple.Create("Facebook", "B");
list.Add(Tuple.Create("SocialMedia", "A");
list.Add(Tuple.Create("SocialMedia", "B");
list.Add(Tuple.Create("SocialMedia", "Dinges");
list.Add(Tuple.Create("SocialMedia", "Facebook");
list.Add(Tuple.Create("Medium", "A");
list.Add(Tuple.Create("Medium", "B");
list.Add(Tuple.Create("Medium", "Dinges");
list.Add(Tuple.Create("Medium", "FaceBook");
list.Add(Tuple.Create("Medium", "SocialMedia");

我真的需要一些帮助来完成这个,我有一些关于传递闭包的技巧,但我真的不能;我无法理解它。非常感谢任何帮助。

【问题讨论】:

    标签: c# dictionary closures tuples


    【解决方案1】:

    从字典方法,我认为它应该被声明为Dictionary&lt;string, List&lt;string&gt;&gt;

    private static IEnumerable<string> TransitiveValues(string name,
                        Dictionary<string, List<string>> lookup)
    {
        yield return name;
        List<string> children;
        if (lookup.TryGetValue(name, out children))
        {
            foreach (string child in children)
            {
                foreach (string value in TransitiveValues(child, lookup))
                {
                    yield return value;
                }
            }
        }
    }
    

    然后:

    var query = from name in dictionary.Keys
                from value in TransitiveValues(name, dictionary)
                select Tuple.Create(name, value);
    var list = query.ToList();
    

    只要确保你没有任何循环 :)

    【讨论】:

    • 这正是我所需要的,现在我只需要弄清楚代码;)非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多