Linq-To-SQL中的黑客新闻样式排序算法

时间:2010-02-13 05:48:32

标签: c# linq linq-to-sql

根据this site,黑客新闻的排序算法是这样的:

  

(p-1)/(t + 2)^ 1.5

     

说明

     

投票除以年龄因素

     

p =来自用户的投票(积分)。 t =   自提交数小时后的时间。

     

p减去1否定   提交者投票。年龄因素是(时间   自提交时间加上两个)到   1.5的力量。

给出类似于此的表结构:

  

物品
  ID
  链接
  DatePosted

     

Item_Votes
  项目ID
  价值

使用linq to sql实现算法的最佳方法是什么,我是否能够完全在linq中编写查询,或者我是否需要使用存储过程或其他东西。

更新。根据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;

3 个答案:

答案 0 :(得分:4)

使用 2 1 Linq querie s (可能仍然更有效率)

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
    };

答案 1 :(得分:1)

使用Comparer。这将允许您以任何方式编写行之间比较的逻辑。

以下是一个示例,使用不区分大小写的顺序:

public void LinqExample()
{
    string[] words = { 
        "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" 
    };

    var sortedWords = words.OrderBy(a => a, new CaseInsensitiveComparer());

    ObjectDumper.Write(sortedWords);
}

public class CaseInsensitiveComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        return string.Compare(x, y, StringComparison.OrdinalIgnoreCase);
    }
}

http://msdn.microsoft.com/en-us/vcsharp/aa336756.aspx

答案 2 :(得分:1)

这可能有用(未经测试):

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();