小型轮询机制的最佳算法是什么?

时间:2016-07-02 07:10:22

标签: c# algorithm

我正在为产品编写一个小型投票,每个用户可以对其每个属性(例如:清洁度和整洁度,服务,位置,员工)进行5个分数(可以稍后增加)进行轮询。每个分数都有一个形容词(1:最差,2:差,3:好,4:非常好,5:非凡)。

例如,用户可以轮询到以下产品之一: CleanLiness and Neatness:4(非常好) 服务:3(好) 位置:1(最差) 员工:5人(特别)

这个分数的平均值是产品的分数,它将是十进制的,对于这个例子,它是3.25。

现在我想通过这个结果给出产品的形容词(3.25),如果它的点低于一半像3.25那么,它向下舍入到(对于这个3)并且如果它的点是相等的并且高于一半像3.7一样,它向上(4)

我很想知道最好的算法是什么?

我班级的设计如下:

public class Product
{}

public Class Poll
{
  public int Id {get; set;}
  public int ProductId {get; set;}
  public Product Product {get; set;}
  public decimal Score {get; set}
  public string Adjective {get; set;}
  public ICollection<PollAttributes> Attributes {get; set;}

}

public class Attribute  // for the attribute like Services 
{
  public int Id {get; set;}
  public string Title {get; set;}
  public ICollection<PollAttributes> Attributes {get; set;}
}

public Class PollAttributes
{
  public decimal score {get; set;}

  public int   AttributeId {get; set;}
  public Attribute{get; set;}

  public int   PollId {get; set;} 
  public Poll Poll {get; set;} 
}

2 个答案:

答案 0 :(得分:1)

您可以使用Convert.ToInt32(Math.Round(score))将值四舍五入为整数值,并使用包含属性值的Dictionary(),这样您就可以执行以下操作:

poll.attribute = lookup[Convert.toInt32(Math.Round(score))];

答案 1 :(得分:0)

平均很容易:您只需保留已投票的人数,以及每个参数的分数总和(清洁度,服务等)。 投票完成后,您可以通过将该参数的总和除以计数来获得每个参数的平均值。然后,将5个平均分数相加,并将总和除以5,得到产品的总体平均值。

现在,你创建一个像这样的字符串数组:

    String[] adj = {"Worst", "Acceptable", "Good", "Very Good", "Excellent"};
//let "score" be the product average score
double epsilon = 1e-8;
double score = 3.51;

int adj_index = (int)(score + epsilon);
if(score - adj_index >= 0.5){//the floating part was bigger than half
    adj_index++;
}
printf("Product is %s", adj[adj_index]);

请注意,epsilon的存在是非常必要的,因为3.99999999999999999和4.0被认为是相同的,所以我们需要一个精度参数。实际上,double 4.0不能一直表示为4。