Для всех, кто интересуется подходом, основанным на LINQ, следующий метод работал довольно хорошо и эффективно для меня при определении, является ли целое значение, предоставленное вызывающей стороной, идеальным числом.
bool IsPerfectNumber(int value)
{
var isPerfect = false;
int maxCheck = Convert.ToInt32(Math.Sqrt(value));
int[] possibleDivisors = Enumerable.Range(1, maxCheck).ToArray();
int[] properDivisors = possibleDivisors.Where(d => (value % d == 0)).Select(d => d).ToArray();
int divisorsSum = properDivisors.Sum();
if (IsPrime(divisorsSum))
{
int lastDivisor = properDivisors.Last();
isPerfect = (value == (lastDivisor * divisorsSum));
}
return isPerfect;
}
Для простоты и ясности моя реализация IsPrime (), которая используется в IsPerfectNumber (), опущена.