我有這樣的代碼,請從LINQ查詢LINQ選擇定製隨機岬
Random rand = new Random();
int TotalFound = Query.Count();
if (TotalFound > 0) {
int toSkip = rand.Next(0, TotalFound);
Video Result = Query.Skip(toSkip).Take(1).First();
return Result;
} else
return null;
隨機進入現在,我想添加一個名爲「偏愛」查詢中的列,它是介於0的數和10. Preference值爲8的行將被選擇爲Preference值爲4的行的兩倍。更可能選擇9.8的值。
什麼是實現這種算法的有效方法?
作爲第二步,我可以添加一個參數,允許8值爲3x或4x行設置爲4,用指數曲線而不是線性曲線對結果進行微調。
我真的不知道如何去實現這個效率。
下面是我實現
public static int? SelectRandomId(IQueryable<Media> query, out int totalFound) {
int? Result = null;
// Pull list of ID and Preference from database.
var IdList = query.Select(v => new { ID = v.MediaId, Preference = v.Preference }).ToList();
totalFound = IdList.Count();
// Calculate preferences average and total.
int PreferenceCount = IdList.Where(v => v.Preference.HasValue).Count();
int NoPreferenceCount = IdList.Count() - PreferenceCount;
int PreferenceSum = IdList.Where(v => v.Preference.HasValue).Sum(v => PreferenceToInt(v.Preference.Value));
// Use value 10 for every item if it is not specified for any.
int PreferenceAvg = (PreferenceCount > 0 ? PreferenceSum/PreferenceCount : 10);
// Videos with no preference get the average value.
int PreferenceTotal = PreferenceSum + NoPreferenceCount * PreferenceAvg;
// Get a random number between zero and the sum of all the preferences
Random rand = new Random();
int number = rand.Next(0, PreferenceTotal);
int rollingSumOfPreferences = 0;
// Set default value in case a value doesn't get assigned by the loop.
if (totalFound > 0)
Result = IdList[0].ID;
// Select an index from the video list, but weighted by preference
foreach (var item in IdList) {
// Add the current item's preference to the rolling sum
if (item.Preference.HasValue)
rollingSumOfPreferences += PreferenceToInt(item.Preference.Value);
else
rollingSumOfPreferences += PreferenceAvg;
// If we've hit or passed the random number, select this item
if (rollingSumOfPreferences >= number) {
Result = item.ID;
break;
}
}
return Result;
}
private static int PreferenceToInt(float preference) {
return (int)(Math.Pow(preference, 1.2) * 100);
}
這是LINQ to SQL的,還是什麼? – 2014-09-18 23:51:34
Linq to Entities – 2014-09-19 00:00:14