У меня есть страница, которая отображает два объекта, а затем пользователь выбирает один из них. Я записываю предпочтения и сочетание в базе данных MSSQL и в конечном итоге хранения данных, как это:Найдите комбинацию из двух элементов, которые не были просмотрены вместе (LINQ, SQL или C#)
UserId=1, BetterObjectId=1, WorseObjectId=2
Теперь я хотел бы, чтобы не показывать, что сочетание объектов (1,2/2,1) когда-либо снова.
Как я могу создать случайные комбинации, чтобы показать пользователя, исключая ранее просмотренные комбинации?
Это кажется, что это должно быть очень простой вопрос, но, как и большинство программистов, я мало сна и кофе, так ваша помощь ценится :-)
очень наивный подход является чем-то вроде это (и все вызовы этой функции должны быть обернуты в проверке, чтобы увидеть, если пользователь уже оценили, как много раз, как Ncr где п есть число элементов и г 2):
public List<Item> GetTwoRandomItems(int userId)
{
Item i = null, i2 = null;
List<Item> r = null;
while (i == null || i2 == null)
{
r = GetTwoRandomItemsRaw();
i = r[0];
i2 = r[1];
if (GetRating(i.Id, i2.Id, userId) != null) /* Checks if viewed */
{
i = null;
i2 = null;
}
}
return r;
}
private List<Item> GetTwoRandomItemsRaw()
{
return Items.ToList().OrderBy(i => Guid.NewGuid()).Take(2).ToList();
}
Редактирует
Используя некоторый SQL, я могу сгенерировать список всех элементов, которые не являются полными (т. есть комбинация с элементом, который пользователь не видел), но я не думаю, что это особенно полезно.
Я также могу представить себе любую возможную комбинацию и исключение уже просмотренных до выбора 2 случайных предметов, но это еще одно страшное решение.
Возможность (интенсивная память для больших n) - генерировать все возможные комбинации и сохранять комбинацию в рейтинге. Тогда я могу просто сделать SELECT всех комбинаций. WHERE combinationId IS NOT IN (SELECT combId FROM ratings WHERE userId = x) с некоторыми изменениями, отражающими симметричное соотношение комбинаций.
Спасибо за вход! Я задавался вопросом о сохранении победителя отдельно - на данный момент это был WinnerId/LoserId, а не Item1, Item2, Winner. –
Это компромисс между пространством и способностью к порядку. –