通过字典中的两个键索引值的最佳方法是什么。例如:让学生使用唯一的Id(整数)和用户名(字符串)创建一个字典,其中包含由Id和username索引的学生类型的对象。然后在检索上使用Id或用户名。 或者可能是词典不是很好的匹配? 附:我知道元组但是没有看到它们如何在这种情况下使用。
编辑:作为使用两个键的替代方法,我可以创建一个由唯一分隔符分隔的id和username的字符串表示,然后使用正则表达式匹配键?!例:“1625 | user1”
答案 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)
不,只有当您同时拥有Tuple
和Id
时,Username
才会帮助您。您可以为每个密钥使用Dictionaries
。你也可以实现自己的Dictionary
,它可以让你查询两个键,因为它们的类型不同:
class MyDictionary : IDictionary<int, Student>, IDictionary<string, Student> {
// full implementation
}
答案 3 :(得分:0)
使用student对象是你想要的一个很好的选择,但你必须覆盖相等的函数(Equals和GetHashCode)才能使它正常工作。
在仔细阅读本部分之后编辑“然后在检索中使用Id或用户名”我认为我的答案不是最好的方法。我会带两个字典,所以+1给@JonHanna。