将我的(短)Python修复为C#算法端口

将我的(短)Python修复为C#算法端口,c#,python,math,port,C#,Python,Math,Port,基于Reddit编写排序算法如下: 我很难把所有这些都整合在一起,因为有些系统。数学签名的应用不同 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.

基于Reddit编写排序算法如下:

我很难把所有这些都整合在一起,因为有些系统。数学签名的应用不同

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"
"

我能在方法签名中找到的最接近的匹配是:
我的一个建议是使用。因此:


好的,那么您对这一行有问题:

return Math.Round(order + sign + *seconds/45000, 7);
首先,你可能会在
秒/45000
中丢失小数部分,因为它们都是
int
。先将一个转换为两个:
((双)秒/45000)

第二,你可能有一个语法错误
sign+*seconds
。你是说
+
还是
*
?它认为你把
seconds
当作指针来使用

最后,返回一个
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()
不正确。我根据以下内容改编:


我的一个建议是使用。因此:


好的,那么您对这一行有问题:

return Math.Round(order + sign + *seconds/45000, 7);
首先,你可能会在
秒/45000
中丢失小数部分,因为它们都是
int
。先将一个转换为两个:
((双)秒/45000)

第二,你可能有一个语法错误
sign+*seconds
。你是说
+
还是
*
?它认为你把
seconds
当作指针来使用

最后,返回一个
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()
不正确。我根据以下内容改编:


最后一行出现语法错误-序列
+*
无效。我认为最后一行需要的是以下内容(使用):


最后一行出现语法错误-序列
+*
无效。我认为最后一行需要的是以下内容(使用):


到底是什么问题,或者您遇到了什么问题?如果可能的话,我想检查一般错误,但我还添加了特定的生成错误。Reddits有微秒,而您有毫秒。不知道这是否导致了问题,但这是一个问题。您遇到的确切编译器错误是什么?有人告诉我可能需要使用它如果没有上下文,问题到底是什么,或者您遇到了什么问题?如果可能的话,我想检查一般错误,但我还添加了特定的生成错误。Reddits有微秒,而您有毫秒。不知道这是否导致了问题,但这是一个问题。您遇到的编译器错误是什么?有人告诉我可能会需要在没有上下文的情况下使用此选项,谢谢。我可以只交换代码?似乎表示是。是的,请注意我链接到了文档,但用于
Int32
版本,而不是
double
版本。谢谢。我可以只交换代码?似乎表示是。是的,请注意我链接到了文档,但用于
Int32
version,而不是
double
版本。
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); 
} 
return Math.Round(order + sign * ((double)seconds / 45000), 7);