字典与两把钥匙

时间:2012-09-05 13:18:07

标签: c# dictionary

通过字典中的两个键索引值的最佳方法是什么。例如:让学生使用唯一的Id(整数)和用户名(字符串)创建一个字典,其中包含由Id和username索引的学生类型的对象。然后在检索上使用Id或用户名。 或者可能是词典不是很好的匹配? 附:我知道元组但是没有看到它们如何在这种情况下使用。

编辑:作为使用两个键的替代方法,我可以创建一个由唯一分隔符分隔的id和username的字符串表示,然后使用正则表达式匹配键?!例:“1625 | user1”

4 个答案:

答案 0 :(得分:8)

由于您希望能够通过任何一种检索,因此您需要两个词典。

假设Student类型是引用类型,每个学生仍然只有一个Student个对象,所以不要担心。

最好将字典包装在一个对象中:

public class StudentDictionary
{
  private readonly Dictionary<int, Student> _byId = new Dictionary<int, Student>();
  private readonly Dictionary<string, Student> _byUsername = new Dictionary<string, Student>();//use appropriate `IEqualityComparer<string>` if you want other than ordinal string match
  public void Add(Student student)
  {
    _byId[student.ID] = student;
    _byUsername[student.Username] = student;
  }
  public bool TryGetValue(int id, out Student student)
  {
    return _byId.TryGetValue(id, out student);
  }
  public bool TryGetValue(string username, out Student student)
  {
    return _byUsername.TryGetValue(username, out student);
  }
}

等等。

答案 1 :(得分:3)

您可以使用两个同步的词典,一个将名称映射到学生,另一个将ID映射到学生。最简单的方法可能是在你自己的类中包装它来处理同步。

答案 2 :(得分:2)

不,只有当您同时拥有TupleId时,Username才会帮助您。您可以为每个密钥使用Dictionaries。你也可以实现自己的Dictionary,它可以让你查询两个键,因为它们的类型不同:

class MyDictionary : IDictionary<int, Student>, IDictionary<string, Student> {
    // full implementation
}

答案 3 :(得分:0)

使用student对象是你想要的一个很好的选择,但你必须覆盖相等的函数(Equals和GetHashCode)才能使它正常工作。

在仔细阅读本部分之后编辑“然后在检索中使用Id或用户名”我认为我的答案不是最好的方法。我会带两个字典,所以+1给@JonHanna。