どちらでも取得できるようにしたいので、2 つの辞書が必要になります。
Student
型が参照型であると仮定すると、Student
学生ごとにオブジェクトが 1 つしかないため、心配する必要はありません。
辞書を単一のオブジェクトにラップするのが最善です。
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);
}
}
等々。