【问题标题】:Converting a Dictionary to a Tree in C# - fastest method?在 C# 中将字典转换为树 - 最快的方法?
【发布时间】:2015-12-19 12:57:46
【问题描述】:

我有一个 Dictionary 包含公司中的每个用户。每个用户都有一个经理。我希望能够从给定的用户走到他们管理链中的每个人。

我能看到的最简单的方法是向 User 添加一个 Employees 属性,这将是一个 List指向他们管理的所有用户。

然后我将遍历字典,为每个用户(使用 ContainsKey)进行查找,然后将它们添加到相应的管理器中。

有更快的方法吗?我觉得我经常扫描表格(每个用户的经理都有一个 ContainsKey),但我看不到解决方法。

我错过了什么吗?

【问题讨论】:

  • 听起来 user 实际上是一个Employee,每个员工都有一个Manager 属性,它本身就派生自Employee。这样,您不需要List<Employee>,您可以简单地遍历给定员工的所有经理的图表。
  • 这会带你上路,但这意味着我需要遍历每个员工的经理列表,看看我是否命中了给定的经理。如果我只想要一个经理,这可能会更快,但如果我想重复搜索不同的经理,那么我必须在每次搜索时对所有员工进行完整的遍历。

标签: c# dictionary tree


【解决方案1】:

这是我现在得到的代码:

var results = ActiveDirectory.GetUsers(filter);
var userList = results.ToDictionary(result => result.ID);

foreach (var result in results)
{
    if (userList.ContainsKey(result.Manager))
    {
        userList[result.Manager].Employees.Add(result);
    }
}

这似乎很快。我只是想知道我是否可以做一些更快的事情。

【讨论】:

  • Dictionary 针对按键访问进行了优化。不要以为在那里你会变得更好。但是您要访问它两次,一次使用userList.ContainsKey(),一次使用userList[]。您可以通过以下方式进行一次访问:User manager; if (userList.TryGetValue(result.Manager, out manager) { manager.Employees.Add(result); }
  • 顺便说一句。密钥访问是O(1)。所以你不是在“扫描表”(O(n);foreach (var keyValue in dictionary) { if (keyValue.Key == searchedKey) { return true; } } return false;),而是直接通过键访问它(dictionary.ContainsKey(searchedKey))。
猜你喜欢
  • 2014-06-28
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
相关资源
最近更新 更多