Ответ Мэтта, сначала получение ключей, отдельно - правильный путь. Да, будет некоторая избыточность - но это будет работать. Я бы взял рабочую программу, которую легко отлаживать и поддерживать по сравнению с эффективной программой, которая либо не будет работать, либо ее сложно поддерживать в любой день.
Не забывайте, что если вы сделаете MovieUser
ссылочным типом, массив будет размером только с столько ссылок, сколько у вас есть пользователей - это довольно мало. Миллион пользователей займет всего 4 МБ или 8 МБ на x64. Сколько пользователей у вас действительно есть?
Ваш код должен быть примерно таким:
IEnumerable<MovieUser> users = RetrieveUsers();
IDictionary<MovieUser, float> questions = new Dictionary<MovieUser, float>();
foreach (MovieUser user in users)
{
questions[user] = RetrieveGuess(user);
}
Если вы используете .NET 3.5 (и поэтому можете использовать LINQ), это еще проще:
IDictionary<MovieUser, float> questions =
RetrieveUsers.ToDictionary(user => user, user => RetrieveGuess(user));
Обратите внимание, что если RetrieveUsers()
может транслировать список пользователей из его источника (например, из файла), то он все равно будет эффективен, так как вам никогда не нужно знать о более чем одном из них одновременно, когда вы заполняете словарь.
Несколько комментариев к остальной части вашего кода:
- Кодовые соглашения имеют значение. Используйте названия ваших типов и методов с заглавными буквами, чтобы они соответствовали другому .NET-коду.
- Вы не звоните
Dispose
на IEnumerator<T>
, полученном при звонке на GetEnumerator
. Если вы просто используете foreach
, ваш код будет проще и безопаснее.
MovieUser
почти наверняка должен быть классом. У вас есть действительно веская причина сделать его структурой?