Расчеты в вашем коде сравнения независимы (т. Е. Сравнение зависит только от упорядочения значения, которое можно вычислить без ссылки на элемент, с которым вы сравниваете).Поэтому сначала вы должны рассчитать свое положительное процентное число и просто использовать вычисленное значение в своем компараторе.
Это, безусловно, должно быть сделано в базе данных, если это возможно (т. Е. Если у вас есть доступ для внесения изменений в базу данных).Базы данных подходят для такого рода вычислений, и вы, вероятно, могли бы делать это на лету, не имея необходимости кэшировать вычисленные значения, и я имею в виду представление, которое вычисляет процент для вас, а не производит предварительный расчет и сохранение значения каждый раз, когда происходитположительный или отрицательный голос.Это избавит от необходимости скачивать все фотографии для сравнения, так как вы можете просто заказать на положительный процент.Ниже приведен пример SQL, который выполнит эту работу (обратите внимание, что это всего лишь пример ... вы можете сохранить голос как немного более эффективный).Таблица голосов содержит список всех голосов за конкретную фотографию и голосовавших за нее.
declare @votes table(
pictureId int,
voterId int,
vote int)
insert into @votes select 1,1,1
insert into @votes select 1,2,-1
insert into @votes select 1,3,1
insert into @votes select 1,4,1
insert into @votes select 2,1,-1
insert into @votes select 2,2,-1
insert into @votes select 2,3,1
insert into @votes select 2,4,1
declare @votesView table(
pictureId int,
positiveVotes int,
NegativeVotes int)
insert into @votesView
select pictureId, sum(case when vote > 0 then 1 else 0 end) as PositiveVotes,
SUM(case when vote < 0 then 1 else 0 end) as NegativeVotes from @votes group by pictureId
select pictureId, convert(decimal(6,2),positiveVotes) / convert(decimal(6,2), (positiveVotes + negativeVotes)) as rating from @votesView