4

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

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

4

4 回答 4

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);
  }
}

等等。

于 2012-09-05T13:24:47.637 回答
3

您可以使用两个保持同步的字典,一个将姓名映射到学生,另一个将 ID 映射到学生。最简单的方法可能是将其包装在您自己的处理同步的类中。

于 2012-09-05T13:20:12.280 回答
2

不,Tuple只有当你总是同时拥有Id和时才对你有帮助Username。您可以Dictionaries为每个键使用 a 。您还可以实现自己的Dictionary,使您能够查询两个键,因为它们的类型不同:

class MyDictionary : IDictionary<int, Student>, IDictionary<string, Student> {
    // full implementation
}
于 2012-09-05T13:20:56.987 回答
0

使用 student 对象是您想要的一个不错的选择,但您必须重写相等函数(Equals 和 GetHashCode)才能使其正常工作。

在更仔细地阅读这部分之后进行编辑“然后在检索时使用 ID 或用户名”我认为我的回答不是最好的方法。我会带两本字典,所以 +1 给@JonHanna。

于 2012-09-05T13:21:48.687 回答