Selon ce site, l’algorithme de commande pour les nouvelles des hackers ressemble à ceci:
(p – 1) / (t + 2) ^ 1,5
La description:
Votes divisés par facteur d’âge
- Comptage des lignes affichées par richtextbox en C #
- Comment appeler à partir du projet
- BufferBlock et ActionBlock avec BoundedCapacity n’utilise pas le DOP max.
- Contrôle du format de réponse WCF et des espaces de noms
- C # Lecture de mots de passe cryptés
p = votes (points) des utilisateurs. t = temps depuis la soumission en heures.
p est soustrait de 1 pour annuler le vote des auteurs. Le facteur d’âge correspond à la puissance de 1,5 (temps écoulé depuis la soumission en heures plus deux).
Étant donné une structure de table similaire à celle-ci:
Article
ID
Lien
Date postéeItem_Votes
ID de l’article
Valeur
Quel serait le meilleur moyen d’implémenter l’algorithme en utilisant linq to sql, serais-je capable d’écrire la requête entièrement dans linq ou aurais-je besoin d’utiliser une procédure stockée ou autre chose?
Mettre à jour. Nous avons fini par utiliser le code ci-dessous basé sur la réponse de TJB:
var votesQuery = from i in db.Items join v in db.Item_Votes on i.ItemID equals v.ItemID orderby (double)(v.Value - 1) / Math.Pow( (DateTime.Now - i.DatePosted.Value).TotalHours + 2, 1.5) descending select i;
Utilisation de 2 1 Linq querie s (il existe probablement encore un moyen plus efficace)
var votesQuery = from i in items join v in votes on i.Id equals v.ItemId orderby (v.Value - 1) / Math.Pow( (DateTime.Now - i.Posted).Add(new TimeSpan(2,0,0)).Hours, 1.5 ) select new { Item = i, Vote = v };
Utilisez une Comparer
. Cela vous permettra d’écrire la logique des comparaisons entre les lignes comme vous le souhaitez.
Voici un exemple utilisant un ordre ne respectant pas la casse:
public void LinqExample() { ssortingng[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" }; var sortedWords = words.OrderBy(a => a, new CaseInsensitiveComparer()); ObjectDumper.Write(sortedWords); } public class CaseInsensitiveComparer : IComparer { public int Compare(ssortingng x, ssortingng y) { return ssortingng.Compare(x, y, SsortingngComparison.OrdinalIgnoreCase); } }
Cela pourrait fonctionner (non testé):
var orderedList = from extracted in ( from i in unorderedList select new { Item = i, Order = (p - 1) / Math.Pow(t + 2, 1.5) } orderby extracted.Order select extracted.Item ).ToList();