通过字典中的两个键索引值的最佳方法是什么。例如:让具有唯一 ID(整数)和用户名(字符串)的学生创建一个字典,其中包含由 ID 和用户名索引的学生类型对象。然后在检索时使用 ID 或用户名。或者可能是字典不是一个很好的匹配?PS 我知道元组,但没有看到如何在这种情况下使用它们。
编辑:作为使用两个键的替代方法,我可以创建由唯一分隔符分隔的 id 和用户名的字符串表示,然后使用正则表达式匹配键?!例如:“1625|user1”
通过字典中的两个键索引值的最佳方法是什么。例如:让具有唯一 ID(整数)和用户名(字符串)的学生创建一个字典,其中包含由 ID 和用户名索引的学生类型对象。然后在检索时使用 ID 或用户名。或者可能是字典不是一个很好的匹配?PS 我知道元组,但没有看到如何在这种情况下使用它们。
编辑:作为使用两个键的替代方法,我可以创建由唯一分隔符分隔的 id 和用户名的字符串表示,然后使用正则表达式匹配键?!例如:“1625|user1”
由于您希望能够通过其中任何一个进行检索,因此您需要两个字典。
假设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);
}
}
等等。
您可以使用两个保持同步的字典,一个将姓名映射到学生,另一个将 ID 映射到学生。最简单的方法可能是将其包装在您自己的处理同步的类中。
不,Tuple
只有当你总是同时拥有Id
和时才对你有帮助Username
。您可以Dictionaries
为每个键使用 a 。您还可以实现自己的Dictionary
,使您能够查询两个键,因为它们的类型不同:
class MyDictionary : IDictionary<int, Student>, IDictionary<string, Student> {
// full implementation
}
使用 student 对象是您想要的一个不错的选择,但您必须重写相等函数(Equals 和 GetHashCode)才能使其正常工作。
在更仔细地阅读这部分之后进行编辑“然后在检索时使用 ID 或用户名”我认为我的回答不是最好的方法。我会带两本字典,所以 +1 给@JonHanna。