У меня есть метод, который должен рассмотреть коллекцию экземпляров класса и найти первое положительное число, отсутствующее как атрибут в этих экземплярах.
Вот моя ситуация: у меня есть класс с именем GestorePersonale
(класс менеджера сотрудника), который управляет List
экземплярами Dipendente
(класс сотрудника). Каждый Dipendente
имеет идентификатор, который должен быть уникальным среди всех других экземпляров Dipendente
, присутствующих в List
.
При создании нового Dipendente
Мне нужно найти уникальный идентификатор, чтобы назначить ему.
Для этой задачи я сначала выясняю самый высокий идентификатор (Matricola
) среди всех экземпляров в списке, а затем циклически перебираю все числа от 0 до этого идентификатора, чтобы попытаться найти идентификатор пробела для использования в новом Dipendente
. Если ничего не помогает, я просто назначу идентификатор, соответствующий max + 1
.
Вот метод MatricolaMax()
, который отвечает за возвращение самого высокого идентификатора среди идентификаторов всех экземпляров в List
(я публикую этот код только для ясности, это не часть вопрос сосредоточен на том, что хотя любые предложения по улучшению производительности также будут высоко оценены здесь) :
private uint MatricolaMax ()
{
// Looking for the highest ID
return dipendenti.OrderByDescending( dipendente => dipendente.Matricola ).First().Matricola;
}
и вот метод, к которому относится этот вопрос:
private uint MatricolaLibera ()
{
var max = MatricolaMax();
for ( uint i = 0; i < max; i++ )
{
var conto = dipendenti.Where( dipendente => dipendente.Matricola == i ).Count();
if ( conto == 0 )
return i;
}
return max + 1;
}
Как вы можете видеть в приведенном выше коде, чтобы найти идентификатор пропуска, я использую запрос Where
, чтобы проверить, существует ли экземпляр Dipendente
с Matricola
(ID), соответствующим i
.
Если бы я делал это, используя цикл for вместо запроса, я бы написал следующий код:
private uint MatricolaLibera ()
{
var max = MatricolaMax();
bool found;
for ( uint i = 0; i < max; i++ )
{
found = false;
for( int j = 0; j < dipendenti.Count; j++)
if ( dipendenti[j].Matricola == i )
{
found = true;
break;
}
if ( !found )
return i;
}
return max + 1;
}
в основном добавляет внутренний цикл for
и проверку bool, чтобы увидеть, был ли найден свободный идентификатор.
Мой вопрос к вам следующий:
Какой из двух представленных методов (запрос против внутреннего для цикла) работает лучше всего? Существует ли еще лучшее решение?