0

在这里编写基于 Reddit 的排序算法:http: //amix.dk/blog/post/19588

由于某些 System.Math 签名在它们的应用程序中不同,我很难将它们组合在一起。

public class Calculation
{
    protected DateTime Epoch = new DateTime(1970,1,1);

    protected int EpochSeconds(DateTime date)
    {
        var td = date - Epoch;
        return td.Days*86400 + td.Seconds + ((td.Milliseconds)/1000000);
    }

    protected int Score(int upVotes,int downVotes)
    {
        return upVotes - downVotes;
    }

    public int HotScore(int upVotes,int downVotes,DateTime date)
    {
        var s = Score(upVotes, downVotes);
        var order = Math.Log(Math.Max(Math.Abs(s), 1), 10);
        var sign = Math.Sign(s); //Edit from Jonathon Reinhart
        var seconds = EpochSeconds(date) - 1134028003;
        return Math.Round(order + sign + *seconds/45000, 7);
    }
}

编辑以获取更多信息

具体来说,我在最后一行遇到错误

return Math.Round(order + sign + *seconds/45000, 7);
//error "The * or -> operator must be applied to a pointer"

"

我可以在方法签名中找到的最接近的匹配是:http: //msdn.microsoft.com/en-us/library/f5898377

4

2 回答 2

2

我会提出的一项建议是使用Math.Sign(Int32). 所以:

var sign = new int();
if (s > 0) { sign = 1; }
else if (s < 0) { sign = -1; }
else { sign = 0; }

变成:

var sign = Math.Sign(s);

好的,所以你在这条线上遇到了问题:

return Math.Round(order + sign + *seconds/45000, 7);

一方面,您可能会丢失 中的小数部分seconds/45000,因为它们都是int。先施以加倍: ((double)seconds / 45000).

对于两个,您可能遇到了语法错误sign + *seconds。你的意思是+*?它认为你使用seconds的就像一个指针。

最后,Math.Round返回 a double,但您的HotScore方法返回的是int。我猜你希望它返回一个double.

我的猜测是这就是你想要的:

public double HotScore(int upVotes,int downVotes,DateTime date)
{
    var score = Score(upVotes, downVotes);
    var order = Math.Log(Math.Max(Math.Abs(score), 1), 10);
    var sign = Math.Sign(score);
    var seconds = EpochSeconds(date) - 1134028003;
    return Math.Round(order + sign * ((double)seconds/45000), 7);
}

另外,我不认为你EpochSeconds()是正确的。我从这里改编了这个:

public long GetEpochTime(DateTime dt) 
{ 
    var ts = dt.Subtract(Convert.ToDateTime("1/1/1970 8:00:00 AM")); 

    return ((((((ts.Days * 24) + ts.Hours) * 60) + ts.Minutes) * 60) + ts.Seconds); 
} 
于 2012-08-07T20:56:49.367 回答
1

最后一行有语法错误 - 的序列+ *无效。我认为你想要的最后一行是这个(使用这个Math.Round重载):

return Math.Round(order + sign * ((double)seconds / 45000), 7);
于 2012-08-07T21:01:27.127 回答